Básicamente, puede usarlo en cualquier momento que desee "inyectar" las variables de entorno pasadas a un script de shell (como argumentos) como si estuvieran establecidas en el entorno a través de export
, pero sin tener que tener que residir permanentemente en export
la lista antes de ejecutar comandos .
NOTA: También existe la forma larga del -k
interruptor, set -o keyword
.
Ejemplo
$ cat cmd1.bash
#!/bin/bash
echo $VARCMD
Ahora si yo set -k
:
$ set -k; ./cmd1.bash VARCMD="hi"; set +k
hi
Pero si solo ejecutara el script anterior:
$ ./cmd1.bash
$
¿Qué hace la exportación?
$ help export
...
Marks each NAME for automatic export to the environment of subsequently
executed commands. If VALUE is supplied, assign VALUE before exporting.
...
Entonces, si tuviéramos que agregar export | grep VAR
a nuestro script así:
$ cat cmd2.bash
#!/bin/bash
echo $VARCMD
export | grep VAR
Y volvimos a ejecutar nuestras pruebas anteriores:
$ set -k; ./cmd2.bash VARCMD="hi"; set +k
hi
declare -x VARCMD="hi"
Pero sin set -k
:
$ ./cmd2.bash
$
Entonces, set -k
nos permite exportar temporalmente variables en masa.
Otro ejemplo
$ cat cmd3.bash
#!/bin/bash
echo $VARCMD1
echo $VARCMD2
export | grep VAR
Cuando establecemos múltiples variables, todas se exportan:
$ set -k; ./cmd3.bash VARCMD1="hi" VARCMD2="bye"; set +k
hi
bye
declare -x VARCMD1="hi"
declare -x VARCMD2="bye"
Entonces, ¿solo está inyectando todas las variables de entorno?
No -k
está haciendo algo muy explícito aquí. Solo exporta variables que se incluyeron en la línea de comando cuando se ejecutó un comando.
Ejemplo
Digamos que configuro esta variable:
$ VARCMD1="hi"
Ahora cuando ejecutamos el mismo comando omitiendo VARCMD1="hi"
:
$ set -k; ./cmd3.bash VARCMD2="bye"; set +k
bye
declare -x VARCMD2="bye"
¿Pero por qué existe esto?
Encontré esta fuente que explica un poco sobre esta característica, titulada: "Cadenas de asignación de parámetros de palabras clave". NOTA: La URL de origen utiliza una dirección IP, por lo que no puedo vincularla directamente aquí en SE.
http://140.120.7.21/OpenSystem2/SoftwareTools/node16.html
Al programar en cualquier lenguaje, la variable y su paso de valor es fundamental para escribir código confiable. Además de los tipos de variables enteras y de matriz, todas las demás variables de shell aceptan cadenas como sus valores. Cuando hablamos del lenguaje de programación de shell, para ser coherentes, preferimos la frase "parámetro de palabra clave". Aquí hay algunos puntos a tener en cuenta al asignar valores a los parámetros de palabras clave:
Para evitar cualquier efecto inesperado, coloque siempre la subcadena de asignación de parámetros delante de una cadena de comando.
En el shell B, los valores asignados de los parámetros de palabras clave se almacenarán en variables de shell (locales). En bash y ksh, las cadenas de asignación de parámetros de palabras clave que preceden el comando no se almacenarán en las variables de shell. Solo afectan el subproceso inmediato bifurcado para ejecutar el comando actual. Una línea de cadenas de asignación de parámetros de palabras clave solo se almacena en las variables de shell (locales). Las cadenas de asignación de parámetros de palabras clave también pueden aparecer como argumentos para los comandos incorporados alias, declarar, componer, exportar, solo lectura y local. [Sección 3.4 del Manual de referencia de Bash]
Las cadenas de asignación de parámetros de palabras clave se tratarán como argumentos para que se ejecute el comando, si se colocan después del nombre del comando.
- Los parámetros de palabras clave pueden ser manipulados por el comando set.
-k
nos permite ejecutar scripts de shell de 30 años sin la necesidad de refactorizarlos. Pase variables de entorno temporales utilizando la sintaxis de prefijo en su lugar:var1=x var2=y command ...