Я нашел 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
, которая должна соответствовать текущей среде оболочки, в которой она выполняется.