Concordo que não está muito claro.
1. Na inicialização do shell,
-
se a variável
_estiver no ambiente em quebashrecebeu , entãobashnão será afetada.Em particular, se esse
bashshell foi invocado por outrobashshell (embora as implementaçõeszsh,yashe algumaskshtambém façam ), então,bashshell terá definido o ambiente_variável para o caminho do comando que está sendo executado (que é o terceiro ponto em sua pergunta). Por exemplo, sebashfor invocado para interpretar um script como resultado de outra interpretação debashshell:bash-script some argsEsse
bashterá passado_=/path/to/bash-scripno ambiente dado abash-script, e é isso que a inicial O valor da variável$_bashestará no shellbashque interpreta esse script.$ env -i _=whatever bash -c 'echo "$_"' whatever -
Agora, se o aplicativo chamado não passar um ambiente
_variável , o shellbashinvocado inicializará$_para oargv[0]que receber próprio que poderia serbashou/path/to/bashou/path/to/some-scriptou qualquer outra coisa (no exemplo acima, isso seria/bin/bashse a explosão do script fosse#! /bin/bashou/path/to/bash-scriptdependendo do sistema ).Para que o texto seja enganoso, pois descreve o comportamento do chamador no qual
bashnão tem controle. O aplicativo que invocoubashpode muito bem não definir$_(na prática, apenas alguns shells e algumas raras aplicações interativas,execlp()não por exemplo), ou poderia usá-lo para algo completamente diferente (por exemplo,ksh93define como*pid*/path/to/command).$ env bash -c 'echo "$_"' /usr/bin/env (env did not set it to /bin/bash, so the value we get is the one passed to env by my interactive shell) $ ksh93 -c 'bash -c "echo \$_"' *20042*/bin/bash
2. Posteriormente
O Subsequentemente também não é muito claro. Na prática, isso é assim que bash interpreta um comando simples no ambiente atual do shell.
-
No caso de um shell interativo , isso estará no primeiro comando simples interpretado a partir de
/etc/bash.bashrc, por exemplo.Por exemplo, no prompt de um shell interativo:
$ echo "$_" ] (the last arg of the last command from my ~/.bashrc) $ f() { echo test; } $ echo "$_" ] (the command-line before had no simple command, so we get the last argument of that previous echo commandline) $ (: test) $ echo "$_" ] (simple command, but in a sub-shell environment) $ : test $ echo "$_" test -
Para um shell não interativo , seria o primeiro comando em
$BASH_ENVou do código alimentado para esse shell se$BASH_ENVnão fosse conjunto.
3. Quando o Bash executa um comando
O terceiro ponto é algo diferente e é sugerido na discussão acima.
bash , como alguns outros shells passarão uma variável de ambiente _ para comandos que executam que contém o caminho que bash usou como o primeiro argumento para as chamadas do sistema execve() .
$ env | grep '^_'
_=/usr/bin/env
4. Ao verificar o correio
O quarto ponto é descrito com mais detalhes na descrição da variável MAILPATH :
'MAILPATH'
A colon-separated list of filenames which the shell periodically checks for new mail.
Each list entry can specify the message that is printed when new mail arrives in the mail file by separating the filename from the message with a '?'. When used in the text of the message, '$_' expands to the name of the current mail file.
Exemplo:
$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>