Concordo que não está muito claro.
1. Na inicialização do shell,
-
se a variável
_
estiver no ambiente em quebash
recebeu , entãobash
não será afetada.Em particular, se esse
bash
shell foi invocado por outrobash
shell (embora as implementaçõeszsh
,yash
e algumasksh
também façam ), então,bash
shell terá definido o ambiente_
variável para o caminho do comando que está sendo executado (que é o terceiro ponto em sua pergunta). Por exemplo, sebash
for invocado para interpretar um script como resultado de outra interpretação debash
shell:bash-script some args
Esse
bash
terá passado_=/path/to/bash-scrip
no ambiente dado abash-script
, e é isso que a inicial O valor da variável$_
bash
estará no shellbash
que interpreta esse script.$ env -i _=whatever bash -c 'echo "$_"' whatever
-
Agora, se o aplicativo chamado não passar um ambiente
_
variável , o shellbash
invocado inicializará$_
para oargv[0]
que receber próprio que poderia serbash
ou/path/to/bash
ou/path/to/some-script
ou qualquer outra coisa (no exemplo acima, isso seria/bin/bash
se a explosão do script fosse#! /bin/bash
ou/path/to/bash-script
dependendo do sistema ).Para que o texto seja enganoso, pois descreve o comportamento do chamador no qual
bash
não tem controle. O aplicativo que invocoubash
pode 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,ksh93
define 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_ENV
ou do código alimentado para esse shell se$BASH_ENV
nã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>