Переменная окружения против переменной 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).