Concordo que não está muito claro.
1. Na inicialização do shell,
se a _
variável estava no ambiente que bash
recebeu , bash
ela permanece intocada.
Em particular, se isso bash
shell foi invocado por outro bash
shell (embora zsh
, yash
e algumas ksh
implementações também fazê-lo), então isso bash
shell irá ter definido a _
variável de ambiente para o caminho do comando a ser executado (que é o 3º ponto na sua pergunta). Por exemplo, se bash
for chamado para interpretar um script como resultado de outra bash
interpretação do shell:
bash-script some args
Isso bash
já passou _=/path/to/bash-scrip
no ambiente fornecido bash-script
, e é esse o valor inicial da $_
bash
variável no bash
shell que interpreta esse script.
$ env -i _=whatever bash -c 'echo "$_"'
whatever
Agora, se o aplicativo que invoca não passa uma _
variável de ambiente , o bash
shell invocado será inicializado $_
para argv[0]
receber a si próprio o que poderia ser bash
, /path/to/bash
ou
/path/to/some-script
ou qualquer outra coisa (no exemplo acima, isso seria /bin/bash
se o estrondo do script foi #! /bin/bash
ou /path/to/bash-script
dependendo do sistema ).
Portanto, esse texto é enganoso, pois descreve o comportamento do chamador que bash
não tem controle. O aplicativo invocado
bash
pode muito bem não ser definido $_
(na prática, apenas alguns shells e alguns aplicativos interativos raros o fazem, execlp()
por exemplo), ou pode ser usado para algo completamente diferente (por exemplo, o ksh93
define *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 subseqüente 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 , esse será o primeiro comando simples interpretado, /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 no $BASH_ENV
ou do código alimentado para esse shell se $BASH_ENV
não estiver definido.
3. Quando o Bash executa um comando
O terceiro ponto é algo diferente e é sugerido na discussão acima.
bash
, como algumas outras shells, passará uma _
variável de ambiente para os comandos executados que contêm o caminho bash
usado como o primeiro argumento para as execve()
chamadas do sistema.
$ env | grep '^_'
_=/usr/bin/env
4. Ao verificar o correio
O quarto ponto é descrito em mais detalhes na descrição da MAILPATH
variável:
'MAILPATH'
Uma lista de nomes de arquivos separados por dois pontos que o shell verifica periodicamente por novos emails .
Cada entrada da lista pode especificar a mensagem que será impressa quando um novo email chegar no arquivo , separando o nome do arquivo da mensagem com um '?' Quando usado no texto da mensagem, '$ _' se expande para o nome do arquivo de mensagens atual.
Exemplo:
$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>