Ответы:
$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
export
не обязательно устанавливать переменную окружения. stackoverflow.com/questions/7411455/…
export
устанавливает переменную окружения для дочерних процессов. Пост, на который вы ссылаетесь, не противоречит этому ответу. Не могли бы вы пояснить, почему вы считаете его неправильным?
export
абсолютно установить переменную среды
Есть разница. Переменные оболочки и переменные среды объяснят это лучше, чем я, но вот выдержка из этого:
Если в переменную оболочки вносится изменение, оно должно быть явно «экспортировано» в соответствующую переменную среды, чтобы любые разветвленные подпроцессы могли увидеть это изменение. Напомним, что переменные оболочки являются локальными для оболочки, в которой они были определены.
Переменная оболочки: Краткосрочная, Применяется только к текущему экземпляру оболочки, Не применимо для всей системы
Переменная среды: долгосрочное использование, действительная система, глобально допустимая
По соглашению переменные оболочки имеют свое имя в нижнем регистре, а 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).