为什么以下两种显示当前 shell 环境变量的方式不同?

为什么以下两种显示当前 shell 环境变量的方式不同?

我找到了我的 bash shell 的 pid

$ echo $$
7791

然后我通过两种不同的方式检查其环境变量:

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

https://stackoverflow.com/a/532284/156458, 和

$ env

然而它们的输出并不相同。例如,它们显示不同的 值PATH。为什么它们不同?谢谢。

答案1

您应该阅读下面这个误导性答案的评论。

/proc/$PID/environ不被 shell 实时使用。它仅代表进程启动时的初始环境。

在 shell 中完成的任何操作(包括其初始化脚本)都可以在 shell 内更改这些值,而不会更改proc您正在查看的条目。

答案2

/proc/7791/environ显示 shell 的原始环境,它是在使用 execve 系统调用启动进程时接收到的:

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

当 shell 运行时,它可以更改其导出变量集,例如通过计算.bashrc.然后,envpenv程序启动时,这个新集合将被传递到向量中。

答案3

无论您想解决什么问题,您都可以尝试使用

/proc/self

解决它。不是获取 shell 的初始环境,而是

cat /proc/self/environ

显示命令的环境cat,该环境应等于执行该命令的 shell 的当前环境。

相关内容