Você pode basicamente usá-lo sempre que quiser "injetar" as variáveis de ambiente passadas em um shell script (como argumentos) como se elas estivessem definidas dentro do ambiente via export
, mas sem ter que residir permanentemente em% lista deexport
antes de executar comandos.
OBSERVAÇÃO: há também o formato longo da opção -k
, set -o keyword
.
Exemplo
$ cat cmd1.bash
#!/bin/bash
echo $VARCMD
Agora, se eu set -k
:
$ set -k; ./cmd1.bash VARCMD="hi"; set +k
hi
Mas se eu fosse executar o script acima:
$ ./cmd1.bash
$
O que a exportação está fazendo?
$ help export
...
Marks each NAME for automatic export to the environment of subsequently
executed commands. If VALUE is supplied, assign VALUE before exporting.
...
Então, se adicionarmos export | grep VAR
ao nosso script da seguinte forma:
$ cat cmd2.bash
#!/bin/bash
echo $VARCMD
export | grep VAR
E fizemos os testes acima novamente:
$ set -k; ./cmd2.bash VARCMD="hi"; set +k
hi
declare -x VARCMD="hi"
Mas sem set -k
:
$ ./cmd2.bash
$
Portanto, set -k
nos permite exportar temporariamente variáveis em massa.
Outro exemplo
$ cat cmd3.bash
#!/bin/bash
echo $VARCMD1
echo $VARCMD2
export | grep VAR
Quando definimos várias variáveis, elas são exportadas:
$ set -k; ./cmd3.bash VARCMD1="hi" VARCMD2="bye"; set +k
hi
bye
declare -x VARCMD1="hi"
declare -x VARCMD2="bye"
Então, é só injetar todas as variáveis de ambiente?
Nenhum -k
está fazendo uma coisa muito explícita aqui. É somente exportar variáveis que foram incluídas na linha de comando quando um comando foi executado.
Exemplo
Digamos que eu configure essa variável:
$ VARCMD1="hi"
Agora, quando executamos o mesmo comando, omitindo VARCMD1="hi"
:
$ set -k; ./cmd3.bash VARCMD2="bye"; set +k
bye
declare -x VARCMD2="bye"
Mas por que isso existe?
Eu encontrei essa fonte que explica um pouco sobre esse recurso, intitulado: "Sequências de atribuição de parâmetro de palavra-chave". OBSERVAÇÃO: O URL de origem usa um endereço IP, portanto não posso vinculá-lo diretamente aqui no SE.
http://140.120.7.21/OpenSystem2/SoftwareTools/node16.html
When programming in any language, the variable and its value passing is critical for writing reliable code. Beside the integer and array variable types, all other shell variables accept strings as their values. When talking about shell programming language, to be consistent, we prefer the phrase "keyword parameter". Here are a few points to watch out when assigning values to keyword parameters:
To avoid any unexpected effect, always place parameter assignment substring in front of a command string.
In the B shell, the assigned values of keyword parameters will get stored in (local) shell variables. In bash and ksh, the keyword parameter assignment strings preceding command will not be stored in the shell variables. They only affect the immediate subprocess forked to execute the current command. A line of keyword parameters assignment strings alone does get stored in the (local) shell variables. Keyword parameter assignment strings may also appear as arguments to the alias, declare, typeset, export, readonly, and local builtin commands. [Section 3.4 of Bash Reference Manual]
The keyword parameter assignment strings will be treated as arguments for the command to be executed, if they are placed after the command name.
- The keyword parameters may be manipulated by the set command.