Por que exportar -p exclui a variável $ _?

4

Até onde eu sei, existem 3 maneiras de ver as variáveis exportadas:

$ export -p | wc -l
50
$ env | wc -l
51
$ printenv | wc -l
51

Como você pode ver, export -p erra a variável única. É um $_ um:

$ diff <(export -p |sed 's/declare -x //' | sed 's/"//g' | sort) <(printenv | sort)
41a42
> _=/usr/bin/printenv

$_ é variável especial configurada para o argumento final do comando anterior executado. Por que export -p não o inclui, ao contrário de outros dois comandos?

Editar

Entendo que exportar $_ pode não ter sentido, mas se $_ não for exportado, por que aparece em printenv output? printenv imprime variáveis de ambiente, variáveis de ambiente são exportadas, $_ não é exportado. Estou faltando alguma coisa aqui?

    
por Nykakin 05.03.2014 / 18:09

3 respostas

4

$_ não parece ser uma variável de ambiente em bash , bash aparece apenas para exportá-lo para um ambiente de processo filho. Dentro do próprio bash, parece ser uma variável de shell normal. Note, no entanto, este não é o caso quando o primeiro comando é executado:

$ bash -c 'export -p | grep _='
declare -x _="/bin/bash"

Depois, no entanto, aparece como uma variável normal:

$ bash -c ':; declare -p | grep _='
declare -- BASH_EXECUTION_STRING=":; declare -p | grep _="
declare -- _=":

Este não é o caso em dash :

$ dash -c 'export -p | grep _='
export _='/bin/dash'
$ dash -c ':; export -p | grep _='
export _='/bin/dash'

Embora aqui pareça apenas assumir seu papel adequado no modo interativo:

$ dash
$ :
$ export -p | grep _=
export _=':'
    
por 05.03.2014 / 18:44
2

export -p não mostra $_ pela simples razão de que o comando mostra apenas as variáveis marcadas para exportação e $_ (sendo um parâmetro especial e não uma variável - sim, a documentação bash faz essa distinção) não está marcada para exportação pelo shell. Embora você possa atribuir a _ , bash sobrescreverá seu valor após cada comando. bash também parece impedir, ou pelo menos desfazer, qualquer tentativa de exportar explicitamente _ .

    
por 05.03.2014 / 23:28
0

De help export :

  -p    display a list of all exported variables and functions

O que implicaria que $_ simplesmente não é exportado. Isso também faz sentido, já que $_ é o último argumento do comando anterior exportando para um shell separado, não seria muito útil, pois sempre será automaticamente redefinido dependendo da última execução do comando.

Você pode confirmar que os comandos que você tentou apenas listam as variáveis exportadas:

$ export -p | wc -l
41
$ foo="bar"
$ export -p | wc -l
41
$ export foo="bar"
$ export -p | wc -l
42

Para ver a lista completa de variáveis definidas atualmente (exportadas ou não), use set sem argumentos. Isso, no entanto, também listará as funções, então você precisará filtrá-las:

$ set | grep -P '^\S.*=' | wc -l
83
$ foo=bar
$ set | grep -P '^\S.*=' | wc -l
84
    
por 05.03.2014 / 18:42