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

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

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

В чем разница?

58
задан 14 February 2011 в 16:08

5 ответов

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

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

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

Объяснение переменных среды см. В Переменные среды Справки Ubuntu.

0
ответ дан 14 February 2011 в 16:08

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

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

По соглашению Shell Переменная имеет свое имя в нижнем регистре, а Envn. Переменные записываются в верхнем регистре

0
ответ дан 14 February 2011 в 16:08

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

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

0
ответ дан 14 February 2011 в 16:08

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

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

0
ответ дан 14 February 2011 в 16:08

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

Похожие вопросы: