Введение
Переменная среды — это значение, определяемое пользователем, которое может влиять на поведение запущенных процессов в операционной системе. Переменные среды являются частью окружения, в котором выполняется процесс. Например, запущенный процесс может запросить значение переменной среды TEMP, чтобы определить подходящее место для хранения временных файлов, или переменной HOME или USERPROFILE, чтобы найти структуру каталогов, принадлежащую пользователю, запустившему процесс. Они были введены в современном виде в 1979 году с выпуском Unix версии 7 и с тех пор включены во все варианты и дистрибутивы Unix-подобных операционных систем, включая Linux и macOS. Начиная с PC DOS 2.0 в 1982 году, все последующие операционные системы Microsoft, включая Microsoft Windows и OS/2, также поддерживают их как функцию, хотя и с несколько отличающимся синтаксисом, способом использования и стандартными именами переменных.
An environment variable is a user definable value that can affect the way running processes will behave on a computer. Environment variables are part of the environment in which a process runs. For example, a running process can query the value of the TEMP environment variable to discover a suitable location to store temporary files, or the HOME or USERPROFILE variable to find the directory structure owned by the user running the process. They were introduced in their modern form in 1979 with Version 7 Unix, so are included in all Unix operating system flavors and variants from that point onward including Linux and macOS. From PC DOS 2.0 in 1982, all succeeding Microsoft operating systems, including Microsoft Windows, and OS/2 also have included them as a feature, although with somewhat different syntax, usage and standard variable names.
Дизайн
Во всех Unix и Unix-подобных системах, а также в Windows, каждый процесс имеет свой собственный набор переменных окружения. По умолчанию, при создании процесса, он наследует дублированное окружение времени выполнения от родительского процесса, за исключением явных изменений, внесенных родителем при создании дочернего процесса. На уровне API эти изменения должны быть сделаны между вызовами fork и exec. В качестве альтернативы, из командных оболочек, таких как bash, пользователь может изменить переменные окружения для конкретного вызова команды, косвенно вызвав его через env или используя обозначение ПЕРЕМЕННАЯ_ОКРУЖЕНИЯ=ЗНАЧЕНИЕ <команда>. Запущенная программа может получать доступ к значениям переменных окружения для целей конфигурации. Shell-скрипты и пакетные файлы используют переменные окружения для передачи данных и предпочтений дочерним процессам. Они также могут использоваться для хранения временных значений для последующего использования в скрипте оболочки. Однако в Unix для этого предпочтительнее использовать неэкспортированные переменные, так как они не распространяются за пределы процесса. В Unix изменение переменной окружения в скрипте или скомпилированной программе повлияет только на этот процесс и, возможно, на дочерние процессы. Родительский процесс и любые несвязанные процессы не будут затронуты. Аналогично, изменение или удаление значения переменной внутри DOS или Windows пакетного файла изменит переменную на время существования COMMAND.COM или CMD.EXE, соответственно. В Unix переменные окружения обычно инициализируются во время запуска системы системными скриптами инициализации и, следовательно, наследуются всеми остальными процессами в системе. Пользователи могут и часто дополняют их в скрипте профиля для используемой командной оболочки. В Microsoft Windows значение по умолчанию каждой переменной окружения хранится в реестре Windows или устанавливается в файле AUTOEXEC.BAT. В Unix программа с setuid получает окружение, выбранное вызывающей стороной, но выполняется с другими правами, чем у вызывающей стороны. Динамический компоновщик обычно загружает код из расположений, указанных переменными окружения $LD_LIBRARY_PATH и $LD_PRELOAD, и запускает его с правами процесса. Если бы программа с setuid сделала это, она была бы небезопасна, поскольку ее вызывающая сторона могла бы заставить ее выполнить произвольный код и, следовательно, злоупотребить ее правами. По этой причине libc сбрасывает эти переменные окружения при запуске в процессе с setuid. Программы с setuid обычно сбрасывают неизвестные переменные окружения и проверяют другие или устанавливают их на разумные значения. В общем, набор переменных окружения функционирует как ассоциативный массив, где ключи и значения являются строками. Интерпретация символов в любой строке различается в разных системах. Когда необходимо представить структуры данных, такие как списки, обычно используется список, разделенный двоеточиями (распространенное решение в Unix и Unix-подобных системах) или точками с запятой (распространенное решение в Windows и DOS).
Синтаксис
Переменные могут использоваться как в скриптах, так и в командной строке. Обычно к ним обращаются, добавляя специальные символы перед или вокруг имени переменной. Принято выбирать имена переменных окружения, состоящие только из заглавных букв. В коде программ это помогает отличать переменные окружения от других идентификаторов. Имена переменных окружения чувствительны к регистру в Unix-подобных операционных системах, но не в DOS, OS/2 и Windows.