Кто-то сказал мне, что:
BASH не является переменной среды, это переменная оболочки
В чем разница?
Кто-то сказал мне, что:
BASH не является переменной среды, это переменная оболочки
В чем разница?
$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
Есть разница. Переменные оболочки и переменные среды объяснят это лучше, чем я могу, но вот отрывок из нее :
Если внесено изменение в переменную оболочки, она должна быть явно «экспортирована» в соответствующую переменную среды, чтобы просмотреть все измененные подпроцессы. Напомним, что переменные оболочки являются локальными для оболочки, в которой они были определены.
Shell Variable: Short Term, применяется только к текущему экземпляру оболочки, не применимо к системе
Экологическая переменная: долгосрочное использование, допустимая система, глобально разрешенная
По соглашению Shell Variable имеет свое имя в нижнем регистре, а Envn. Переменные записываются как заглавные
Чтобы ответить на этот вопрос, сначала попробуйте понять область действия переменной.
При создании новой переменной, такой как 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).