Por que quando eu altero uma variável ENV e a echo no mesmo comando, não vejo o novo valor? [duplicado]

1

Quando executo PATH=abc:$PATH echo $PATH , obtenho o valor antigo para PATH , não abc:PATH

Por que isso? Como posso obter abc:$PATH ?

Editar: Que tal para PATH=/mybin:$PATH which python if /mybin tem um executável python?

    
por Jonathan Allen Grant 24.05.2018 / 21:05

3 respostas

4

Quando você corre

PATH=abc:$PATH echo $PATH

ou, no caso mais geral,

variable=value utility

o variable é definido no ambiente do utility (mas não no ambiente atual).

No entanto, quando sua linha de comando é analisada, o valor da variável PATH é retirado do ambiente atual .

Você teria que definir a variável no ambiente onde a variável é expandida. Você pode fazer isso separando-o em duas etapas, como em

PATH=abc:$PATH; echo "$PATH"

que definiria PATH no ambiente atual e então executaria echo "$PATH" , ou definiria a variável para um shell filho, como em

PATH=abc:$PATH sh -c 'echo "$PATH"'

que definiria a variável PATH dentro de sh -c , mas não no shell atual.

No seu segundo exemplo,

PATH=/mybin:$PATH which python

O utilitário which provavelmente dirá que python é encontrado em /mybin desde que você modifique PATH em seu ambiente. Observe como PATH nunca é expandido no ambiente atual aqui, mas internamente por which .

Por acaso, which python é melhor (mais portável) escrito command -v python (consulte " Por que não usar" o que "? usar então? ").

Apenas uma reflexão rápida sobre o seu título, onde você diz " ENV variable". A variável ENV , mesmo que não seja isso que você quis dizer, é uma variável de ambiente que algumas implementações de sh (e algumas outras shells) usam. Se seu valor for o nome de um arquivo, esse arquivo será originado antes de iniciar uma sessão de shell interativa. bash tem uma variável BASH_ENV que funciona da mesma maneira, mas para shells não interativos.

    
por 24.05.2018 / 21:19
1

Execute a substituição em um subshell em vez do shell atual.

PATH=abc:$PATH sh -c 'echo $PATH'
    
por 24.05.2018 / 21:07
1

O motivo é que a expansão para echo $PATH acontece antes da criação do ambiente modificado.

Você pode gostar de ligar:

PATH=abc:$PATH env

para ver que o ambiente para o comando realmente é modificado.

Desde a expansão do argumento echo em

PATH=abc:$PATH echo $PATH

acontece antes do novo ambiente ser configurado, você precisa dividir as coisas em dois comandos:

(PATH=abc:$PATH; echo $PATH)

faz o que você gosta. O sub shell () é necessário para evitar que a alteração do ambiente sobreviva ao tempo de vida do comando echo .

    
por 24.05.2018 / 22:05