Подтвердить что ты не робот

Установка переменной среды в оболочке script не делает ее видимой для оболочки

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

Вот мой script:

#!/bin/bash

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

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

Hello!
After setting MYVAR!

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

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

4b9b3361

Ответ 1

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

Один из способов обойти это - с помощью команды source:

source ./test.sh

или

. ./test.sh

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

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

Ответ 2

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

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