Важно понимать, что у каждого процесса есть свой набор переменных среды.
Когда процесс вызывает fork()
системный вызов, создается второй процесс ( дочерний ), идентичный первому ( родительский ) (эта копия включает среду, которая находится чуть выше стека (или чуть ниже), в зависимости от того, как вы думаете о стеках :-)
- но в Unix / Linux стек растет вниз от высоких адресов).
Обычно дочерний процесс вызывает execve()
системный вызов, который отбрасывает все в своей (виртуальной) памяти и восстанавливает его из разделов кода и данных в указанном двоичном файле.
Однако, когда он восстанавливает стек, он копирует окружение и строки аргументов, переданные execve()
в стек сначала (в указанном порядке), прежде чем вызывать main()
функцию (большая часть работы выполняется в crt0
коде начальной загрузки после execve()
возврата (к записи). точка указана в двоичном виде)).
В execve()
библиотеке C есть обертки для системного вызова, которые передают текущую среду (т. Е. Копию родительской среды), а не вызывающую ее вызывающую (так что в действительности дочерний процесс наследует родительскую среду) - смотрите environ(7)
.
Попробуйте запустить (как root) команду ps axeww | less
... это покажет вам среду для всех процессов! Интересным является процесс с идентификатором 1 (т.е. init
процесс - первый процесс, созданный ядром во время загрузки).
Если вы хотите посмотреть на среду для определенного процесса (и знаете, что это идентификатор процесса), попробуйте выполнить команду cat /proc/<PID>/environ
(заменив <PID>
ее идентификатором процесса).
Обратите внимание, что если процесс имеет достаточные привилегии, он может переписать свой собственный стек, что может затруднить понимание его среды - вы увидите некоторые процессы-демоны, подобные этому, в выводе ps.
Но, в конце концов, вся эта вафля сводится к тому, что @chaos сказал выше, если вы хотите посмотреть текущее значение определенной переменной среды в вашем процессе оболочки, просто используйте (встроенную) команду echo "$<NAME>"
(заменив <NAME>
ее именем переменная окружения, которая вас интересует) ... просто имейте в виду, что одна и та же переменная может иметь другое значение или не существовать вообще в другом процессе.
echo
плохой выбор команды, поскольку он может преобразовать содержимое переменной. Он выведет содержимое параметра оболочки с тем же именем. Это не обязательно то же самое при использовании Bourne оболочки или окр вары , как1
,*
например. И вы не можете использовать этот подход для переменных env, чье имя недопустимо в качестве имени переменной оболочки.