При передаче экспорта в другую команду (используя 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