回答:
各プロセスにはいくつかの属性があり、他のプロセスとは独立して個別に設定できます。例としては、リソース制限、umask、現在のディレクトリ、環境変数などがあります。プロセスの作成時(fork()
システムコールによる)、子は親からこれらの属性を継承します。この後、子プロセスはこれらの属性を任意に設定できます。(いくつかの制限が適用されます。プロセスは、ハードリソースの制限を増やしたり、現在のディレクトリをexec権限のないディレクトリに変更したりすることはできません。)
いくつかのプログラムだけが環境変数を変更しますが、ほとんどは気にしません。後者のケースを想定してください。したがって、子プロセス自体がさらに子を作成する場合、これらのプロセスは祖父母と同じ環境変数を持ちます。等々。
現在、シェルには表示できる変数がたくさんありますset
(Bourne Shellタイプのシェルでは、Cシェルについては知らない)。これらの変数は、export
edでない限り、環境変数ではありません。環境変数はで表示できますenv
。シェルコマンドラインからプログラムを起動すると、プログラムはシェルから環境変数を継承します。シェルスクリプトから起動されたプログラムの場合も同様です。
したがって、ログイン時にプロファイルデータ(など~/.profile
)を読み取り、それらを事実上すべての子供、孫などに継承するシェルがあります。これは、環境変数の設定が、ログインシェルまたはログインスクリプトから、ログインセッション内で起動された他のすべてのプログラムに伝わる方法です。
1つのターミナルウィンドウで環境変数を作成し、それを別のターミナルウィンドウにエコーしようとしました。それは何も表示しませんでした。
以上の説明で、これは期待通りの結果です。プロセスの環境の変更は、既存のプロセスではなく、今後作成されるこのプロセスの子にのみ影響します。
$TEST=hello
変数の展開が無効になっているか$TEST
、すでに適切な値が設定されていない限り、これはとにかく機能する可能性は低いです。hello
変数に割り当てたい場合はTEST
、次のように言う必要がありますTEST=hello
(注:いいえ$
)。
その後、私はそれをエクスポート
echo
し、別のターミナルウィンドウでもう一度試しました。結果は以前と同じでした。
もう一度、これは期待される結果です。
しかし、ログイン時に同じコードを実行すると(コードを
~/.profile
ファイルに追加)、変数は任意のターミナルウィンドウで使用できます。
これは、ターミナルのシェルが、環境設定を読み取り、~/.profile
これらの設定を継承したシェルの子孫であるためです。