Экспорт не устанавливает переменную при передаче ее в другую команду

Экспорт не устанавливает переменную при передаче ее в другую команду

При передаче экспорта в другую команду (используя bash 3.2) переменная не изменяется.

export USER=new | cat ; env | grep USER

Выход:USER=old

Переменная User не изменяется и остается прежней. Но экспорт успешно завершен: export USER=new | echo $?выводит 0.

решение1

Обычно части конвейера (кроме последней в некоторых оболочках) работают в подоболочках, то есть оболочка разветвляет свою копию для каждой из них, а затем каждая копия обрабатывает команду в этой части и выполняет любые внешние команды (например, catздесь). Основная оболочка, которая продолжает следующую команду (другой конвейер), не видит измененное значение.

(И в любом случае, какое значение, по вашему мнению, varдолжно быть после команды типа var=foo | var=bar?)

Обычно это происходит, когда в последней части конвейера есть назначения переменных, например:

n=0
some command | while read line; do n=$((n+1)); done

что оставило бы nустановленным 0во многих оболочках, но не во всех: ksh и zsh запускают последнюю часть в основной оболочке, и Bash имеет для этого опцию. Это обсуждается вПочему моя переменная является локальной в одном цикле «while read», но не в другом, на первый взгляд похожем цикле?.

решение2

Перепишите код следующим образом:

export USER=new
env | grep $USER

Чтобы получить содержимое переменной, USERвам нужно $раньше. И pipe on exportбессмыслен, так как exportкоманда не имеет никакого вывода в STDOUT

Связанный контент