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

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

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

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

5 ответов

Решение

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

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

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

Переменная окружения доступна глобально в программе и в дочерних программах. Переменная оболочки доступна только в текущей оболочке. Чтобы сделать переменную оболочки доступной в качестве переменной среды, используйте 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

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

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

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

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

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

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

Когда вы создаете новую переменную, как 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).

Другие вопросы по тегам