現在のシェル環境変数を表示する2つの方法が異なるのはなぜですか?

現在のシェル環境変数を表示する2つの方法が異なるのはなぜですか?

私のbashシェルのpidを見つけました

$ echo $$
7791

次に、2つの方法で環境変数を確認しました。

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

~からhttps://stackoverflow.com/a/532284/156458

$ env

ただし、出力は同じではありません。たとえば、異なる値を表示しますPATH。なぜ違うの?ありがとうございます。

答え1

この誤解を招く回答の以下の説明を読んでください。

/proc/$PID/environリアルタイムでシェルでは使用されません。プロセスの開始時の初期環境のみを示します。

初期化スクリプトを含むシェルで実行されるすべての操作は、現在表示されているproc項目を変更することなく、シェル内でこれらの値を変更できます。

答え2

/proc/7791/environexecveシステムコールを使用してプロセスを開始したときに受信したシェルの元の環境を表示します。

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

シェルが実行されているときにエクスポートされた変数セットを変更できます(例:計算).bashrc。これにより、この新しいセットはプログラムの開始時にベクトルに渡されますenvpenv

答え3

解決したい問題が何であれ、以下を試すことができます。

/proc/self

それを修正してください。シェルの初期環境を取得する代わりに、

cat /proc/self/environ

catコマンドを実行しているシェルの現在の環境と同じでなければならないコマンド環境を表示します。

関連情報