Почему следующие два способа отображения переменных среды текущей оболочки различаются?

Почему следующие два способа отображения переменных среды текущей оболочки различаются?

Я нашел pid моей оболочки bash

$ echo $$
7791

Затем я проверяю переменные среды двумя разными способами:

$ cat /proc/7791/environ | tr '\0' '\n'

отhttps://stackoverflow.com/a/532284/156458, и

$ env

Однако их выходы не идентичны. Например, они показывают разные значения PATH. Почему они отличаются? Спасибо.

решение1

Вам следует прочитать комментарии под этим вводящим в заблуждение ответом.

/proc/$PID/environне используется оболочкой в ​​реальном времени. Он просто представляет начальную среду процесса при его запуске.

Любое действие в оболочке, включая ее сценарии инициализации, может изменить эти значения изнутри оболочки, не внося никаких изменений в procпросматриваемую вами запись.

решение2

/proc/7791/environпоказывает исходную среду оболочки, как она была получена процессом при запуске с помощью системного вызова execve:

 int execve(const char *filename, char *const argv[], char *const envp[]);

Когда оболочка запущена, она может изменить свой набор экспортируемых переменных, например, оценивая .bashrc. Этот новый набор затем передается в векторе envpпри envзапуске программы.

решение3

Какую бы проблему вы ни пытались решить, вы можете попробовать использовать

/proc/self

решает это. Вместо того, чтобы получить начальную среду оболочки,

cat /proc/self/environ

отображает среду выполнения команды cat, которая должна соответствовать текущей среде оболочки, в которой она выполняется.

Связанный контент