Uso prático da opção 'set -k' no bash

14

Quando usamos a opção set -k no bash?

Manual de referência da Bash diz,

All arguments in the form of assignment statements are placed in the environment for a command, not just those that precede the command name.

Eu entendo o que a opção faz, mas não consigo imaginar quando precisamos dela.

    
por MS.Kim 24.04.2014 / 02:14

2 respostas

13

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.
    
por 24.04.2014 / 02:33
7

Qualquer uso prático de set -k é provavelmente apenas um estilo pessoal. Alguns - talvez aqueles que gostam de linguagens de programação que oferecem a habilidade de usar argumentos de palavras-chave em chamadas de função, ou aquelas poucas pessoas que gostam da sintaxe do comando dd - podem preferir

set -k
...
command var1=val1 var2=val2

para

var1=val1 var2=val2 command

O motivo real pelo qual a opção existe em alguns shells é explicado na justificativa para o comando set em o padrão POSIX :

The following set flags were omitted intentionally with the following rationale:

The -k flag was originally added by the author of the Bourne shell to make it easier
for users of pre-release versions of the shell. In early versions of the Bourne shell
the construct
    set name=value
had to be used to assign values to shell variables.
    
por 24.04.2014 / 04:14

Tags