Quando você executa set -a var=99
, três coisas distintas acontecem (relacionadas à sua pergunta):
- Uma opção definida (
-a
) (inverter fazendo set +a
) para exportar vars.
- Os parâmetros posicionais são "definidos" para o que segue as opções (
$1
definido como var=99
).
- O sublinhado da variável shell
$_
é definido como o último parâmetro (expandido).
defina -a
A execução de set -a
marca todas as variáveis subsequentes (novas ou alteradas) como exportadas (em todos os shells, exceto em csh
alguns shells relacionados).
$ set -a
$ myvariable=wer
$ env | grep myvariable
myvariable=wer
Para se recuperar dessa configuração, basta alterar -
para a +
:
$ set +a
$ unset myvariable # to erase it from the environment if it
# was exported before the change of set +a
$ myvariable=456544654 # A new value of the variable.
$ env | grep "variable" # No output means the var does not exist
# in the current environment
set var = 99
O que deveria ser, na verdade, set -- var=99
evitar a interpretação de uma opção (e o conjunto possui muito) com valores que começam com um hífen ( -
).
Define a lista de argumentos (a lista de parâmetros posicionais) para aquela após o --
. Isso é válido em todas as conchas razoáveis (não em csh et al). Argumentos posicionais são impressos com "$ @" (ou semelhante "$ *", diferente de).
$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3
_ = last_argument
E, o valor da variável interna do shell _
muda para o último argumento da linha executada. Isso NÃO é verdade em quase todos os shells (jsh, ash, yash, dash, lksh, mksh, ksh93, attsh e, claro, csh e tcsh), exceto o bash.
$ echo one two last argument
one two last argument
$ echo "$_"
argument
$ echo This is a new: last_argument
This is a new: last_argument
$ echo "$_"
last_argument
Observe que o valor em $_
é o valor após a expansão:
$ a="A New_Argument"
$ echo Something else to test: "$a"
Something else to test: A New_Argument
$ echo "$_"
A New_Argument
É por isso que quando você executa:
$ set -a myvar=99; set | grep 'myvar'
_=myvar=99
Você obtém uma descrição da variável do shell '$ _'. Isso também funciona:
$ set -a myvar=99; declare -p _
declare -- _="myvar=99"