Почему экспортированная переменная остается пустой после завершения сценария? - PullRequest
3 голосов
/ 29 июня 2011

У меня есть простая команда в сценарии оболочки Linux (скажем, foo.sh). В нем я делаю это:

export INSTALL_DIR=/mnt/share/TEST_Linux

Я запускаю скрипт с:

> sh foo.sh

Когда она заканчивается, я пытаюсь получить переменную, но значение пустое.

> echo $INSTALL_DIR

Если я ввожу команду напрямую, экспортированная переменная становится глобальной для открытого окна терминала. Я использую Ubuntu.

Ответы [ 4 ]

7 голосов
/ 29 июня 2011

Установка переменных среды является локальной для дочернего процесса bash, выполняющего ваш скрипт. Чтобы добиться того, что вы хотите, вам нужно источник это так: source foo.sh. Это означает, что он запускается вашим основным процессом bash. После этого настройка переменной останется после завершения скрипта.

4 голосов
/ 29 июня 2011

Переменная экспортируется только в новой оболочке , которую вы запускаете. Вы, вероятно, хотите выполнить свой скрипт с source.

source foo.sh
1 голос
/ 29 июня 2011

Поскольку процесс, который вы запускаете (оболочка, выполняющая ваш скрипт), может делать все, что захочет, но его действия не влияют на родительский процесс (текущую оболочку).

Несколько странная аналогия: я могу сделать 5 выстрелов текилы, и мое окружение станет размытым, и законы гравитации будут затронуты в соответствии с моим восприятием. Но моему отцу его окружение такое же, он не напивается из-за моих действий.

Если вы хотите, чтобы переменные, созданные / измененные в вашем скрипте, влияли на вашу текущую оболочку, вы должны source сценарий, как указано в других ответах. Обратите внимание, что это также может изменить результирующий рабочий каталог в вашей оболочке, если скрипт выполнит cd /whatever/path, что любые другие функции, которые были установлены, но также изменены или удалены, также будут затронуты в вашей оболочке.

Действительно странная и не очень хорошая аналогия была бы, если бы я сделал 5 выстрелов текилой, а потом мой отец убил меня и выпил мою кровь.

Я обеспокоен или как? ; -)

1 голос
/ 29 июня 2011

Я не знаю ответа, но я знаю, как его преодолеть.

# source ./foo.sh
# echo $INSTALL_DIR

И это похоже на магию.

Я думаю, это потому, что этот скрипт выполняется в своей "оболочке". Не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...