Ao canalizar a exportação para outro comando (usando o bash 3.2), a variável não é alterada.
export USER=new | cat ; env | grep USER
Saída:USER=old
A variável User não é alterada e permanece a mesma. Mas a exportação foi encerrada com sucesso: export USER=new | echo $?
gera 0.
Responder1
Normalmente, as partes de um pipeline (exceto a última em alguns shells) são executadas em subshells, ou seja, o shell bifurca uma cópia de si mesmo para cada uma delas, e então cada cópia processa o comando naquela parte e executa quaisquer comandos externos (como cat
lá). O shell principal que continua com o próximo comando (o outro pipeline) não vê o valor alterado.
(E em qualquer caso, qual você esperaria que var
fosse o valor após um comando como var=foo | var=bar
?)
Geralmente isso surge quando você tem atribuições de variáveis na última parte de um pipeline, como
n=0
some command | while read line; do n=$((n+1)); done
que deixaria n
definido 0
em muitos shells, mas não em todos: ksh e zsh executam a última parte do shell principal, e o Bash tem uma opção para isso. Isto é discutido emPor que minha variável é local em um loop 'while read', mas não em outro loop aparentemente semelhante?.
Responder2
Reescreva o código desta forma:
export USER=new
env | grep $USER
Para obter o conteúdo da variável USER
que você precisa $
antes. E pipe on export
não tem sentido, pois export
o comando não tem nenhuma saída para STDOUT