「エクスポート」コマンドの用途は何ですか?


12

1つのターミナルウィンドウで環境変数を作成し、それを別のターミナルウィンドウにエコーしようとしました。それは何も表示しませんでした。

$TEST=hello

その後、私はそれをエクスポートechoし、別のターミナルウィンドウでもう一度試しました。結果は以前と同じでした。

export TEST 

しかし、ログイン時に同じコードを実行すると(コードを~/.profileファイルに追加)、変数は任意のターミナルウィンドウで使用できます。ここで何が起きてるの?端末でコードを実行することと、ログイン時に同じコードを実行することの違いは何ですか?

回答:


25

export子プロセス環境に含まれる変数を作成します。他の既存の環境には影響しません。一般に、ある端末で変数を設定して別の端末に自動的に表示させる方法はなく、プロセスごとに環境が確立されます。

に追加すると、.profileログインするたびに新しい変数が含まれるように環境が設定されます。つまり、あるシェルから別のシェルにエクスポートされるのではなく、初期環境をセットアップするときに新しいシェルに含めるように指示しています。


1

各プロセスにはいくつかの属性があり、他のプロセスとは独立して個別に設定できます。例としては、リソース制限、umask、現在のディレクトリ、環境変数などがあります。プロセスの作成時(fork()システムコールによる)、子は親からこれらの属性を継承します。この後、子プロセスはこれらの属性を任意に設定できます。(いくつかの制限が適用されます。プロセスは、ハードリソースの制限を増やしたり、現在のディレクトリをexec権限のないディレクトリに変更したりすることはできません。)

いくつかのプログラムだけが環境変数を変更しますが、ほとんどは気にしません。後者のケースを想定してください。したがって、子プロセス自体がさらに子を作成する場合、これらのプロセスは祖父母と同じ環境変数を持ちます。等々。

現在、シェルには表示できる変数がたくさんありますset(Bourne Shellタイプのシェルでは、Cシェルについては知らない)。これらの変数は、exportedでない限り、環境変数ではありません。環境変数はで表示できますenv。シェルコマンドラインからプログラムを起動すると、プログラムはシェルから環境変数を継承します。シェルスクリプトから起動されたプログラムの場合も同様です。

したがって、ログイン時にプロファイルデータ(など~/.profile)を読み取り、それらを事実上すべての子供、孫などに継承するシェルがあります。これは、環境変数の設定が、ログインシェルまたはログインスクリプトから、ログインセッション内で起動された他のすべてのプログラムに伝わる方法です。

1つのターミナルウィンドウで環境変数を作成し、それを別のターミナルウィンドウにエコーしようとしました。それは何も表示しませんでした。

以上の説明で、これは期待通りの結果です。プロセスの環境の変更は、既存のプロセスではなく、今後作成されるこのプロセスの子にのみ影響します。

$TEST=hello

変数の展開が無効になっているか$TEST、すでに適切な値が設定されていない限り、これはとにかく機能する可能性は低いです。hello変数に割り当てたい場合はTEST、次のように言う必要がありますTEST=hello(注:いいえ$)。

その後、私はそれをエクスポートechoし、別のターミナルウィンドウでもう一度試しました。結果は以前と同じでした。

もう一度、これは期待される結果です。

しかし、ログイン時に同じコードを実行すると(コードを~/.profileファイルに追加)、変数は任意のターミナルウィンドウで使用できます。

これは、ターミナルのシェルが、環境設定を読み取り、~/.profileこれらの設定を継承したシェルの子孫であるためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.