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


Ответы:


35

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

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

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


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

Я не думаю, что это правильно. exportне обязательно устанавливать переменную окружения. stackoverflow.com/questions/7411455/…
— Крис Стрычински

3
@ChrisStryczynski exportустанавливает переменную окружения для дочерних процессов. Пост, на который вы ссылаетесь, не противоречит этому ответу. Не могли бы вы пояснить, почему вы считаете его неправильным?
— Лекенштейн

exportабсолютно установить переменную среды
— Дэвид Тонхофер

9

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

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


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

3
Плюс ваша ссылка больше не работает!

1

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

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

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


-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).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.