2013-02-15 2 views
14

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

Список переменных постоянно меняются, и изменить его на моем конце концов, это не вариант. Любая идея, как я буду заниматься этим?

образец файла foo.sh

FOO="FOOFOO" 
BAR="BARBAR" 

ответ

10

Вы ищете для '' Команда (также пишется «источник» в bash):

source foo.sh 

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

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

Я создал еще один bar.sh скрипт, который имеет источник foo.sh во время чтения строки; do export "$ line" done user2077092

+1

Вам понадобится 'source bar.sh', а также повлиять на текущую среду. – chepner

+0

Кроме того, цикл 'while' вместо' source foo.sh'; вам не нужны оба. Это не так, просто избыточно. – chepner

39

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

set -a 
. foo.sh 
set +a 

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

+0

Большое спасибо, что вылечил головную боль. Это пригодится при передаче переменных в задание, выполняемое fcron. – Saucier

+0

... или при работе с переменными среды nullmailer. – Saucier

0

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

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 
Смежные вопросы