Concordo que não está muito claro.
1. Na inicialização do shell,
se a _variável estava no ambiente que bashrecebeu , bashela permanece intocada.
Em particular, se isso bashshell foi invocado por outro bash
shell (embora zsh, yashe algumas kshimplementações também fazê-lo), então isso bashshell 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 bashfor chamado para interpretar um script como resultado de outra bashinterpretação do shell:
bash-script some args
Isso bashjá passou _=/path/to/bash-scripno ambiente fornecido bash-script, e é esse o valor inicial da $_ bashvariável no bashshell 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 bashshell invocado será inicializado $_para argv[0]receber a si próprio o que poderia ser bash, /path/to/bashou
/path/to/some-scriptou qualquer outra coisa (no exemplo acima, isso seria /bin/bashse 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 bashnão tem controle. O aplicativo invocado
bashpode 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 ksh93define *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 bashinterpreta um comando simples no ambiente atual do shell.
No caso de um shell interativo , esse será o primeiro comando simples interpretado, /etc/bash.bashrcpor 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_ENVou do código alimentado para esse shell se $BASH_ENVnã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 bashusado 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 MAILPATHvariá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>