Переменная окружения против переменной Shell, в чем разница?

56

Кто-то сказал мне, что:

BASH это не переменная окружения, это переменная оболочки

Какая разница?

Том Брито
источник
Похоже, что одно и то же просто имеет другую область?
Александр Миллс

Ответы:

35

$BASHявляется локальной переменной, которая действительна только в текущей (bash) оболочке.

Переменные среды, такие как $SHELLдействительны для всей системы. В текущей оболочке Bash $BASHуказывает на путь выполнения bash , тогда как $SHELLуказывает на оболочку, определенную по умолчанию (которая может иметь одинаковое значение).

Для объяснения переменных среды смотрите Переменные среды в Справке Ubuntu.

Takkat
источник
1
Отличная ссылка (+1) :)
Peter.O
12
Этот ответ неверный / неточный. Переменные среды НЕ являются глобальными / общесистемными. Переменные оболочки являются частными для текущей запущенной оболочки, и они НЕ экспортируются (передаются) никаким дочерним процессам. Переменные среды экспортируются в любые дочерние процессы. «MYVAR = private; export OURVAR = shared; printenv» будет сообщать только «OURVAR», потому что когда оболочка выполняет команду printenv, она экспортирует OURVAR, но не MYVAR.
CM
2
+1 к комментарию CM! Я никогда не слышал, чтобы разница объяснялась так просто и точно !!! Этот комментарий должен быть ответом.
Джесси Ветер Странник
48

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

Примеры для уточнения:

$ SOME=VAR # define shell variable $SOME
$ echo $SOME
VAR
$ env | grep SOME # note: no output
$ export SOME # turn $SOME into an environment variable
$ env | grep SOME
SOME=VAR

Другой способ определить переменную среды:

$ export ANOTHER=VALUE
$ echo $ANOTHER
VALUE
$ env | grep ANOTHER
ANOTHER=VALUE
Lekensteyn
источник
Я не думаю, что это правильно. exportне обязательно устанавливать переменную окружения. stackoverflow.com/questions/7411455/…
Крис Стрычински
3
@ChrisStryczynski exportустанавливает переменную окружения для дочерних процессов. Пост, на который вы ссылаетесь, не противоречит этому ответу. Не могли бы вы пояснить, почему вы считаете его неправильным?
Лекенштейн
exportабсолютно установить переменную среды
Дэвид Тонхофер
9

Есть разница. Переменные оболочки и переменные среды объяснят это лучше, чем я, но вот выдержка из этого:

Если в переменную оболочки вносится изменение, оно должно быть явно «экспортировано» в соответствующую переменную среды, чтобы любые разветвленные подпроцессы могли увидеть это изменение. Напомним, что переменные оболочки являются локальными для оболочки, в которой они были определены.

Peter.O
источник
Я комментирую свой собственный ответ .. Мне очень нравится ссылка Help Ubuntu в ответе Такката ... (это лучше, чем мой)
Peter.O
3
Плюс ваша ссылка больше не работает!
1

Переменная оболочки: Краткосрочная, Применяется только к текущему экземпляру оболочки, Не применимо для всей системы

Переменная среды: долгосрочное использование, действительная система, глобально допустимая

По соглашению переменные оболочки имеют свое имя в нижнем регистре, а Envn. Переменные пишутся в верхнем регистре

Ashish
источник
-1

Чтобы ответить на этот вопрос, сначала попытайтесь понять область действия переменной.

Когда вы создаете новую переменную, как SOME_ENV_VARIABLE="testing.txt"она находится в SHELL scope, это означает, что к нему может получить доступ тот экземпляр оболочки, в который вошел пользователь. Например, при изменении экземпляра вы открываете новый терминал или меняете оболочку (например, вы переключиться на csh) вы не можете получить доступ к этой переменной.

Когда вы экспортируете эту переменную, как export SOME_ENV_VARIABLEэта переменная теперь доступна в области видимости среды, это означает, что в этом случае, если вы измените оболочку, вы все равно сможете получить доступ к этой переменной. Давайте попробуем разобраться со следующим примером:

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell
[vishrant@localhost]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment
[vishrant@localhost]$ env | grep SOME_ENV_VARIABLE
SOME_ENV_VARIABLE=testing.txt
[vishrant@localhost]$ csh #changing shell
[vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost ~/shell_scripting]$ exit
exit #returned to parent shell
[vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt"
[vishrant@localhost]$ csh
[vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE
SOME_SHELL_VARIABLE: Undefined variable.

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

Помните, что если вы откроете новый терминал, вы не сможете получить доступ ни к одной из переменных, потому что вы меняете этот экземпляр . Для этого вы должны добавить свои переменные в или .profileили .bashrc(если вы используете bash).

Vishrant
источник