O Bash Manual diz (página de manual, minha ênfase):
Quando o Bash chama um comando externo, a variável
$_
é configurada para o nome do caminho completo do comando e passada para esse comando em seu ambiente.
E ( Parâmetros especiais ):
_
(
$_
, um sublinhado.) Na inicialização do shell, defina o nome do caminho absoluto usado para chamar o script do shell ou shell sendo executado conforme passado na lista de ambiente ou argumento. Posteriormente, expande para o último argumento para o comando anterior, após a expansão. Defina também o nome do caminho completo usado para chamar cada comando executado e colocado no ambiente exportado para esse comando. Ao verificar o correio, este parâmetro mantém o nome do arquivo de correio.
Em um shell bash, eu corro:
$ bash $ export | grep '_='
De acordo com o manual,
_
deve ser uma variável de ambiente do novo shell bash.export
deve gerar todas as variáveis de ambiente do novo shell bash, mas não gera_
. Então, eu me pergunto se_
é uma variável de ambiente do novo shell bash?Na verdade, em qualquer shell bash, acontece a mesma coisa
$ export | grep '_='
não produz nada. Então, eu me pergunto se
_
alguma vez é uma variável de ambiente de um shell bash?Para comparação:
$ dash $ export | grep '_=' export _='/bin/dash'
Meu post é inspirado no comentário de Mike e na resposta de Stephane .
export
é um builtin, mas se você o usarprintenv _
, ele mostrará como foi chamado:/usr/bin/printenv
neste sistema.bash -c export | grep _=
(a partir Bash), vai mostrar como o shell pai invocou obash
comando, mesmo que$_
não está definido no pai.Respostas:
Sim,
_
é uma variável de ambiente do novo shell Bash; você pode ver isso executandodentro do shell: mostra o conteúdo do ambiente inicial do shell. Você não o verá no primeiro shell, porque não havia um shell anterior para defini-lo antes de iniciar.
A expansão
$_
dentro do Bash refere-se ao_
parâmetro especial, que se expande para o último argumento do comando anterior. (Internamente, o Bash lida com isso usando uma_
variável de shell, que é atualizada toda vez que um comando é analisado, mas isso é realmente um detalhe da implementação. É "não exportado" toda vez que um comando é analisado. )export
Não é exibido_
porque não é uma variável que é marcada como exportada; no entanto, você pode vê-lo na saída deset
.No primeiro exemplo, o novo shell Bash analisa e executa os comandos em seus arquivos de inicialização, portanto, quando em execução
explore | grep '-='
,_
já foi substituído e marcado como não exportado.No
dash
exemplo, ele não parece executar nenhum arquivo de inicialização; portanto, você está vendo a variável como uma variável de ambiente definida pelo Bash antes da execuçãodash
.fonte
export | grep '_='
nada? No shell bash original, por que não produztr '\0' '\n' < /proc/$$/environ | grep _=
nada?_
é descartado do ambiente e como posso exportá-lo de volta para o ambiente ?export
sem argumentos lista todas as variáveis exportadas ._
não é uma variável, mas é listado como um parâmetro especial .Um tanto confuso,
_
também seria um nome válido para uma variável , diferente dos nomes dos outros parâmetros especiais. Pelo menos o Bash 4.4 permite atribuições a ele, sem queixas. Simplesmente não é útil porque o efeito especial substitui imediatamente o valor.fonte
_
como uma variável ;-). É efetivamente somente para gravação e o valor é perdido imediatamente._
como uma variável, e é por isso que aparece na saída deset
. No entanto, não pode ser marcado como exportado, tanto quanto eu possa determinar.Nem todas as variáveis de shell são marcadas como exportadas, como você pode ver na saída de
declare -p
.Não faz sentido
bash
marcar$_
como exportado porque adiciona automaticamente essa variável ao ambiente dos processos filhos, mas com um valor diferente daquele que ela possui no shell (naquele momento).Exibi-lo como exportado apenas confundiria o usuário sobre o que aconteceria com o ambiente de comandos externos.
Todas as "variáveis de tempo de execução"
BASH*
não são exportadas.fonte