Важно понимать, что у каждого процесса есть свой набор переменных среды.
Когда процесс вызывает 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, чье имя недопустимо в качестве имени переменной оболочки.