Переменная окружения vs Переменная Shell, какая разница?

37

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

  

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

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

    
задан Tom Brito 14.02.2011 в 14:08
источник

5 ответов

24

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

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

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

    
ответ дан Takkat 14.02.2011 в 14:29
источник
30

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

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

  

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

    
ответ дан Peter.O 14.02.2011 в 14:23
1

Shell Variable: Short Term, применяется только к текущему экземпляру оболочки, не применимо к системе

Экологическая переменная: долгосрочное использование, допустимая система, глобально разрешенная

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

    
ответ дан Ashish 06.07.2016 в 22:39
0

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

При создании новой переменной, такой как SOME_ENV_VARIABLE="testing.txt" , она находится в SHELL scope , что означает, что к ней может быть доступен этот экземпляр оболочки , где пользователь вошел в систему. например, вы открываете новый терминал или вы меняете оболочку (например, вы переключаетесь на csh ), вы не можете получить доступ к этой переменной.

Когда вы экспортируете такую ​​переменную, как export SOME_ENV_VARIABLE , эта переменная теперь доступна в области среды, то есть в этом экземпляре , если вы измените оболочку, вы можете еще получить доступ к этой переменная. Давайте попробуем разобраться со следующим примером:

[[email protected]]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell
[[email protected]]$ echo $SOME_ENV_VARIABLE
testing.txt
[[email protected]]$ export SOME_ENV_VARIABLE #variable now available with environment
[[email protected]]$ env | grep SOME_ENV_VARIABLE
SOME_ENV_VARIABLE=testing.txt
[[email protected]]$ csh #changing shell
[[email protected] ~/shell_scripting]$ echo $SOME_ENV_VARIABLE
testing.txt
[[email protected] ~/shell_scripting]$ exit
exit #returned to parent shell
[[email protected]]$ SOME_SHELL_VARIABLE="hello.txt"
[[email protected]]$ csh
[[email protected] ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE
SOME_SHELL_VARIABLE: Undefined variable.

Аналогия: предположим, что у вас есть квартира с двумя спальнями, и вы делитесь ею с другим соседом по комнате. С общей зоной можно связаться кто угодно, но не ваши спальни, переменная окружения подобна общей области, а переменная оболочки похожа на спальню, если вы будете что-то в общей области, к которой может обратиться любой, но если вы храните ее в своей спальне, она может доступ к вам.

Помните, если открыть новый терминал, вы не сможете получить доступ к любой из переменных, потому что вы меняете этот экземпляр . Для этого вы должны добавить свои переменные в .profile или .bashrc (если вы используете bash).

    
ответ дан Vishrant 23.12.2017 в 20:21