Exportar não definindo variável ao canalizá-la para outro comando

Exportar não definindo variável ao canalizá-la para outro comando

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 catlá). 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 varfosse 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 ndefinido 0em 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 USERque você precisa $antes. E pipe on exportnão tem sentido, pois exporto comando não tem nenhuma saída para STDOUT

informação relacionada