Depois de executar o set -a var=99
, posso encontrar uma frase na saída de set
:
...
TERM=xterm
UID=0
USER=root
VIRTUAL_ENV_DISABLE_PROMPT=1
_=var=99
colors=/etc/DIR_COLORS
...
Alguém poderia me dizer o que "_ =" significa?
Noto que echo $var
não dará nada. Se eu executar o set -a
, o set
não incluirá essa variável novamente. O que está acontecendo?
Respostas:
Quando você executa
set -a var=99
, três coisas distintas acontecem (relacionadas à sua pergunta):-a
) (inverter fazendoset +a
) para exportar vars.$1
definido comovar=99
).$_
é 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 emcsh
alguns shells relacionados).Para se recuperar dessa configuração, basta alterar
-
para a+
: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)._ = 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.Observe que o valor em
$_
é o valor após a expansão:É por isso que quando você executa:
Você obtém uma descrição da variável do shell '$ _'. Isso também funciona:
fonte
O sublinhado é na verdade uma variável de shell especial. O que você está vendo aqui é a
_
variável underscore ( ) com um valor devar=99
. É somente leitura e mantido pelo shell. Isto é:Seu exemplo se enquadra na segunda categoria. Você digitou:
Assim, o último argumento não havia
var=99
, e que foi o valor que você foram definição (você não estavam montandovar
a99
). Por isso,_
foi definido para isso. E é isso que está sendo relatado:É um pouco confuso, mas o primeiro
=
indica a atribuição à variável_
e o segundo faz parte do valor.Também vale ressaltar que a
-a
opção deset
fazer com que todas as variáveis definidas posteriormente sejam exportadas.fonte
A resposta certa dependeria do shell que você está usando:
bash
, o que o @BobEager disse se aplicazsh
, é definido apenas para o último argumento do comando anterior e para o nome do caminho completo do comando no ambiente do comandodash
apenas definem essa variável ao executar uma sessão interativaPode haver outras particularidades em outras conchas também. Como tal, não
$_
está definido no POSIX, portanto, você deve estar ciente dos possíveis problemas de portabilidade ao usá-lo.Nota lateral: se sua intenção é atribuir o valor de 99
var
e disponibilizá-lo no ambiente de subprocessos subsequentes, a sintaxe correta para conseguir isso é:fonte
unset var;set -a; var=99
. Funciona em todas as conchas ressonáveis (não csh et al).Na impressão não tão fina de bash (1) , encontramos
O que significa
set -a var=99
que não define a variável de ambientevar
como99
; define$1
comovar=99
. Tenteecho "$1"
ouecho "$*"
e você verá.fonte