#bash #shell #environment-variables
#bash #оболочка #переменные среды
Вопрос:
У меня есть что-то подобное в сценарии оболочки
cd /some/folder1
savedCFLAGS=${CFLAGS-}
export CFLAGS="-fexceptions ${CFLAGS-}"
./configure --some-option -what-ever
make
export CFLAGS=${savedCFLAGS}
cd /some/folder2
./configure --some-option -what-ever
make
Это работает более или менее корректно, но имеет один серьезный недостаток.
Если CFLAGS был отключен ранее, после первого блока он будет установлен и пуст.
Иногда это проблема, потому что некоторые скрипты настройки используют значения по умолчанию для переменных, только если они на самом деле не установлены — значение по умолчанию не будет использоваться, если переменная просто пуста.
Позвольте мне также заявить, что у меня есть такие конструкции несколько раз в скрипте с несколькими разными переменными (это скрипт, используемый для построения полной цепочки инструментов на основе GCC).
Какой был бы самый простой способ восстановить предыдущее значение переменной (если оно действительно было установлено ранее) или отменить настройку (если оно было отключено до моих изменений)?
Я мог бы установить savedCFLAGS
некоторый специальный токен, если он был отключен, а затем проверить, имеет ли savedCFLAGS
значение, равное этому токену.
Однако, может быть, есть что-то гораздо более простое?
Ответ №1:
Просто запустите setenv configure make в подоболочке, используя круглые скобки:
(export CFLAGS="-fexceptions ${CFLAGS-}";./configure --some-option -what-ever; make)
Он наследует среду в копии, поэтому при выходе из вложенной оболочки вы получаете точно такое же «предыдущее» состояние: никакие env. переменные никогда не изменяются в вашем скрипте, и дальнейшие configure
команды работают должным образом.
Комментарии:
1. Однако убедитесь, что какие бы команды вы ни выполняли, не ожидается, что они изменят вашу текущую среду. (Иными словами, убедитесь, что вы не используете какие-либо сценарии оболочки внутри
(...)
.