為什麼以下兩種顯示目前 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 的目前環境。

相關內容