現在のシェルの環境変数を表示する次の 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シェルによって実際に使用されるわけではありません。単にプロセスが起動されたときの初期環境を表すだけです。

シェル内で実行されるすべての操作 (init スクリプトを含む) は、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。これは、コマンドが実行されているシェルの現在の環境と同じである必要があります。

関連情報