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

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

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

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

52
задан 07.11.2019, 15:57

5 ответов

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

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

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

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

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

0
ответ дан 07.11.2019, 15:59

Переменная окружения - это глобально доступная программа и ее дочерние программы. Переменная оболочки доступна только в текущей оболочке. Чтобы сделать переменную оболочки доступной в качестве переменной среды, используйте 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
ответ дан 07.11.2019, 15:59
  • 1
    export абсолютно установите переменную среды – Gordon Robertson 07.11.2019, 16:00
  • 2
    @ChrisStryczynski export действительно устанавливает переменную среды для дочерних процессов. Сообщение, которое Вы связали, не противоречит этому ответу, Вы могли разъяснить, почему Вы думаете, что это неправильно? – jnthnclrk 07.11.2019, 16:00
  • 3
    Я don' t думают, что это корректно. export не обязательно устанавливает переменную среды. stackoverflow.com/questions/7411455/… – Gordon Robertson 07.11.2019, 16:01

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

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

0
ответ дан 07.11.2019, 16:00
  • 1
    I' m комментарий моего собственного ответа.. Мне действительно нравится ссылка Ubuntu Справки в Takkat' s отвечают... (it' s лучше, чем мой) – Brad Parks 07.11.2019, 16:00
  • 2
    Плюс Ваша ссылка больше не работает! – studgeek 07.11.2019, 16:01

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

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

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

0
ответ дан 07.11.2019, 16:01
  • 1
    Этот ответ является неправильным/неточным. Переменные среды не глобальны/в масштабе всей системы. Переменные Shell частные к в настоящее время работание оболочка, и они НЕ экспортируются (переданные) никаким дочерним процессам. Переменные среды экспортируются в любые дочерние процессы. " MYVAR=private; OURVAR=shared экспорта; printenv" только сообщил бы " OURVAR" потому что, когда оболочка выполняет команду printenv, она экспортирует OURVAR, но не MYVAR. – AurevoirXavier 07.11.2019, 16:01
  • 2
    Большая ссылка (+1):) – Ixx 07.11.2019, 16:01
  • 3
    +1 к C.M.' s Комментарий! I' ve никогда не слышал различия, объясненного так просто и точно!!! Этот комментарий должен быть ответом. – gcb 07.11.2019, 16:02

Теги

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