Ответы:
Для POSIX-совместимых оболочек (включая Bash) стандарт гласит:
2.5.3 Переменные оболочки Переменные
должны инициализироваться из среды [...] Если переменная инициализируется из среды, она должна быть помечена для экспорта немедленно; см экспорт специальный встроенный. Новые переменные могут быть определены и инициализированы с помощью назначения переменных и т. Д.
И о export
:
export name[=word]...
Оболочка должна предоставлять атрибут экспорта переменным, соответствующим указанным именам, что должно приводить к тому, что они находятся в среде последующих выполняемых команд.
Так что с точки зрения оболочки есть только переменные. Некоторые из них могли быть получены из среды при запуске оболочки, а некоторые из них могут быть экспортированы в среду процессов, запускаемых оболочкой.
(«Среда» - это на самом деле просто набор строк, передаваемых процессу при его запуске. Когда процесс выполняется, он может делать с ним что угодно, использовать его, игнорировать его, перезаписывать его. И то, что процесс передает запуск других процессов может быть еще одной вещью, хотя, конечно, обычно просто снова передаются все переменные среды.)
Если бы вы использовали какую-то не-POSIX оболочку, например csh
, вещи могут отличаться:
$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit
Это одна и та же переменная. В оболочке, в отличие от большинства других языков программирования, переменные среды и переменные оболочки совместно используют одно и то же пространство имен. В оболочке переменная окружения - это переменная оболочки, которая была экспортирована export
.
См., Например, мой ответ на ваш предыдущий вопрос «В чем разница в использовании между переменными оболочки и переменными среды? »
Переменная оболочки может использоваться только для текущей оболочки, она не может использоваться в масштабе всей системы. На другом конце может использоваться переменная среды. По соглашению переменные оболочки записываются в нижнем регистре, а переменные среды - в верхнем. Вы можете заставить переменную оболочки работать как переменную окружения, вам просто нужно ее экспортировать.