2015-05-12 4 views
2

Почему не экспортирует переменную работать в следующем случае:Почему не экспортируют работает с Баш скрипт

В следующем примере я экспортировать переменную PARAM и установите сон 1000 в секунду для запуска сценарий как процесс на заднем плане.

#!/bin/bash 

export PARAM="I AM A REAL VALUE" 

sleep 1000 

поэтому я выполнить сценарий как процесс, как:

/tmp/example.bash & 

Теперь скрипт запускается как процесс (я проверил его с ps -ef) и из консоли Linux Я хочу, чтобы напечатать $PARAM как следующие

echo $PARAM 

, но не имеет значения из переменной PARAM.

Почему? Сценарий export не экспортирует значение при запуске скриптового процесса.

+0

потому что ваш скрипт порождает новую дочернюю оболочку, а затем вы возвращаетесь к родительской оболочке и проверяете переменную. – SMA

+0

Выполняется сценарий под подоболочкой. subshell не может изменить родительскую оболочку (не без халата по крайней мере.) Вам нужно [источник] (http://askubuntu.com/questions/107969/what-is-the-difference-between-source-xx-and- x-in-bash) это. – anishsane

+0

Итак, каков способ печати vars с консоли? или из другого сценария – maihabunash

ответ

2

Когда вы запускаете /tmp/example.bash &, вы устанавливаете среду в суб-оболочке, но это не влияет на родительскую оболочку, которая ее запускала.

Вам нужно (а) удалить sleep 1000 и (б) использовать . команду или (в Bash или оболочку C) команду source прочитать файл как часть текущего процесса:

sed -i.bak '/sleep/d' /tmp/example.bash # GNU or BSD sed 
. /tmp/example.bash 
echo $PARAM 
+0

вы можете написать это. ./tmp/example.bash (вы забыли «.») – maihabunash

+1

В вопросе нет '.' перед '/ tmp/example.bash', поэтому я не забыл о ведущей точке. Но исправление имени файла в соответствии с вашими местными требованиями - это вряд ли ракетостроение; это в значительной степени предполагается в любом SO-ответе, где используются файлы, - требуется переработка имен для соответствия фактическим именам мест. –

Смежные вопросы