Экспорт переменных, определенных в другом файле

У меня есть скрипт, который содержит пару переменных, которые должны быть установлены в качестве переменной среды

Список переменных постоянно меняется, и изменение его с моей стороны не вариант. Есть идеи, как мне это сделать?

пример файла foo.sh

FOO="FOOFOO"
BAR="BARBAR"

3 ответа

Существует разница между переменной и переменной окружения. Если вы выполните . foo.sh а также foo.sh содержит строку FOO=valueтогда переменная FOO будет назначен в текущем процессе. Это не переменная окружения. Чтобы стать переменной окружения (и, таким образом, быть доступной для вложенных оболочек), ее необходимо экспортировать. Тем не менее, оболочки предоставляют опцию, которая заставляет все присвоения переменных преобразовывать переменную в переменную среды, так что если вы просто сделаете:

set -a
. foo.sh
set +a

тогда все назначения переменных в foo.sh будут сделаны переменными окружения в текущем процессе. Обратите внимание, что это не совсем верно: в bash экспорт переменной делает ее переменной окружения в текущей оболочке, но в других оболочках (например, dash) экспорт переменной не делает ее переменной среды в текущей оболочке. (Однако это заставляет его устанавливать его в среде подоболочек.) Однако в контексте оболочки не имеет значения, является ли переменная переменной среды в текущем процессе. Если он экспортируется (и, следовательно, устанавливается в среде любых подпроцессов), переменная, которой нет в среде, функционально эквивалентна переменной среды.

Вы ищете "." команда (также пишется "источник" в bash):

source foo.sh

Поскольку вам также необходимо экспортировать их в среду, вам может потребоваться выполнить небольшую дополнительную работу:

while read -r line; do
    export "$line"
done < foo.sh

Если вы хотите экспортировать только переменные с общим префиксом, например:

BAZ_FOO="FOOFOO"
BAZ_BAR="BARBAR"

Вы можете просто сделать это:

. foo.sh
variable_list=()
variable_list=( $(set -o posix ; set  |\
                  grep "BAZ_"         |\
                  cut -d= -f1) )
for variable in "${variable_list[@]}"
do
  export "$variable"
done
Другие вопросы по тегам