エクスポートされるシェル変数とbashにないシェル変数の違い


41

Bashは、エクスポートされた変数とエクスポートされていない変数を区別するようです。

例:

$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR

set変数を見ますが、見envません。

$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR

set両方の変数が表示envされますが、エクスポートされた変数のみが表示されます。

私はそれsetがbash組み込みであり、そうでenvはないことを知っています。

エクスポートされる変数とエクスポートされない変数の違いは何ですか?


17
用語に関する注意:「環境変数」は常にエクスポートされます。エクスポートされない変数は、「シェル変数」(または「パラメーター」)です。
ジル「SO-悪であるのをやめる」

回答:


44

エクスポートされた変数は、それらをエクスポートしたシェルによって実行されるコマンドの環境に運ばれますが、エクスポートされていない変数は現在のシェル呼び出しに対してローカルです。exportmanページから:

シェルは、指定された名前に対応する変数にエクスポート属性を与えます。これにより、それらの変数は、その後実行されるコマンドの環境になります。

setエクスポートされていないローカル変数を含む現在の環境を出力します。envは、新しい環境でプログラムを起動するために使用され、引数なしでその新しい環境を出力します。以来env、新しい環境を作成しているシェルから起動するプログラムの場合のように、唯一のエクスポートされた変数は、によってもたらされます。たとえば、最初のシェル内に2番目のシェルを生成します(私$$は、内部シェルでプロンプトを表すために使用しました):

$ FOO=BAR
$ bash
$$ echo $FOO             # Note the empty line

$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$

値だけでなく、エクスポートされる変数であることに注意してください。この手段あなた一度ことexport FOOFOO後で変更しても、その後の環境では、グローバル変数やショーアップ次のようになります。

$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$

現在のシェルのみを懸念している場合、エクスポートする必要がありますか?それとは別に、なぜlocale現在のシェルでは更新が表示されないのですか?
Pacerier
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.