Переменные оболочки
Переменные оболочки - это переменные, область действия которых находится в текущем сеансе оболочки, например, в интерактивном сеансе оболочки или в скрипте.
Вы можете создать переменную оболочки, присвоив значение неиспользуемому имени:
var="hello"
Переменные оболочки используются для отслеживания данных в текущем сеансе. Переменные оболочки обычно имеют имена с строчными буквами.
Переменные среды
Переменная окружения - это переменная оболочки, которая была экспортирована. Это означает, что она будет видна как переменная не только в сеансе оболочки, который ее создал, но и для любого процесса (не только оболочки), который запускается из этого сеанса.
VAR="hello" # shell variable created
export VAR # variable now part of the environment
или
export VAR="hello"
После экспорта переменной оболочки она остается экспортированной до тех пор, пока она не будет сброшена или пока ее «свойство экспорта» не будет удалено (с помощью export -n
in bash
), поэтому обычно нет необходимости повторно экспортировать ее. Сброс переменной с помощью unset
удаляет ее (независимо от того, является ли она переменной среды или нет).
Массивы и ассоциативные хеши в bash
и другие оболочки нельзя экспортировать, чтобы они стали переменными среды. Переменные среды должны быть простыми переменными, значения которых являются строками, и они часто имеют имена, состоящие из заглавных букв.
Переменные среды используются для отслеживания данных в текущем сеансе оболочки, а также для того, чтобы любой запущенный процесс мог получить часть этих данных. Типичным случаем этого является PATH
переменная окружения, которая может быть установлена в оболочке и впоследствии использована любой программой, которая хочет запускать программы без указания полного пути к ним.
Коллекция переменных среды в процессе часто упоминается как «среда процесса». Каждый процесс имеет свою собственную среду.
Переменные среды могут быть только «перенаправлены», то есть дочерний процесс никогда не может изменять переменные среды в своем родительском процессе, и кроме настройки среды для дочернего процесса при его запуске, родительский процесс может не изменять существующую среду дочерний процесс.
Переменные среды могут быть перечислены с env
(без каких-либо аргументов). Кроме этого, они выглядят так же, как неэкспортированные переменные оболочки в сеансе оболочки. Это немного особенное для оболочки, так как большинство других языков программирования обычно не смешивают «обычные» переменные с переменными среды (см. Ниже).
env
также может использоваться для установки значений одной или нескольких переменных среды в среде процесса, не устанавливая их в текущем сеансе:
env CC=clang CXX=clang++ make
Это начинается make
с переменной среды, CC
установленной в значение clang
и CXX
установленной в clang++
.
Он также может быть использован для очистки среды для процесса:
env -i bash
Это начинается , bash
но не переносит текущую среду для нового bash
процесса (он все равно будет иметь переменные окружения , как это создает новые из его инициализации оболочки скриптов).
Пример различия
$ var="hello" # create shell variable "var"
$ bash # start _new_ bash session
$ echo "$var" # no output
$ exit # back to original shell session
$ echo "$var" # "hello" is outputted
$ unset var # remove variable
$ export VAR="hello" # create environment variable "VAR"
$ bash
$ echo "$VAR" # "hello" is outputted since it's exported
$ exit # back to original shell session
$ unset VAR # remove variable
$ ( export VAR="hello"; echo "$VAR" ) # set env. var "VAR" to "hello" in subshell and echo it
$ echo "$VAR" # no output since a subshell has its own environment
Другие языки
В большинстве языков программирования есть библиотечные функции, которые позволяют получать и устанавливать переменные среды. Обратите внимание, что поскольку переменные среды хранятся в виде простых отношений ключ-значение, они обычно не являются «переменными» языка. Программа может извлечь значение (которое всегда является символьной строкой), соответствующее ключу (имя переменной среды), но затем должно будет преобразовать его в целое число или любой другой тип данных, который язык ожидает получить от значения.
В C, переменные окружения могут быть доступны с помощью getenv()
, setenv()
, putenv()
и unsetenv()
. Переменные, созданные с помощью этих подпрограмм, наследуются таким же образом любым процессом, который запускает программа на Си.
Другие языки могут иметь специальные структуры данных для выполнения той же задачи, такие как %ENV
хэш в Perl или ENVIRON
ассоциативный массив в большинстве реализаций awk
.