Установка переменной среды в сценарии оболочки не делает ее видимой для оболочки - PullRequest
29 голосов
/ 22 декабря 2011

Я хочу использовать скрипт оболочки, который я могу вызвать, чтобы установить некоторые переменные окружения.Однако после выполнения скрипта я не вижу переменную окружения, использующую «printenv» в bash.

Вот мой скрипт:

#!/bin/bash

echo "Hello!"
export MYVAR=boubou
echo "After setting MYVAR!"

Когда я делаю »./test.sh ", я вижу:

Hello!
After setting MYVAR!

Когда я делаю" printenv MYVAR ", я ничего не вижу.

Вы можете сказать мне, что я делаю неправильно?

Ответы [ 2 ]

52 голосов
/ 22 декабря 2011

Так работают переменные среды.У каждого процесса есть копия окружения.Любые изменения, которые процесс вносит в свою копию, распространяются на дочерние процессы.Однако они не распространяются на родительский процесс.

Один из способов обойти это, используя команду source:

source ./test.sh

или

. ./test.sh

(две формы являются синонимами).

Когда вы делаете это, вместо запуска сценария в под-оболочке, bash будет выполнять каждую команду в сценарии, как если бы она была введена в командной строке..

3 голосов
/ 22 декабря 2011

Другой альтернативой может быть сценарий print переменных, которые вы хотите установить, с echo export VAR=value и do eval "$(./test.sh)" в основной оболочке.Этот подход используется различными программами [например, resize, dircolors], которые предоставляют переменные среды для установки.

Это работает, только если у сценария нет других выходных данных (или если какой-либо другой вывод появляется на stderr с >&2)

...