Bashからエクスポートされたシェル変数とエクスポートされていないシェル変数の違い

Bashからエクスポートされたシェル変数とエクスポートされていないシェル変数の違い

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変数のみが表示されます。

私はこれがsetbash組み込みであることを知っていますが、envそうではありません。

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

ベストアンサー1

エクスポートされた変数はそれをエクスポートするシェルのコマンド環境にインポートされますが、エクスポートされていない変数は現在のシェル呼び出しにローカルです。exportマニュアルページから:

シェルは、指定された名前に対応する変数にエクスポート属性を割り当てる必要があります。これは、後で実行されるコマンド環境にその変数を配置します。

setエクスポートされていないローカル変数を含む現在の環境を印刷します。env新しい環境でプログラムを開始するために使用され、パラメータなしで新しい環境が出力されます。env新しい環境が作成されているため、このシェルで実行されているすべてのプログラムと同様に、エクスポートされた変数のみが導入されます。たとえば、最初のシェル内に2番目のシェルを作成するには($$内部シェル内のプロンプトを表示するために使用します):

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

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

エクスポートされた変数は値だけでなく変数であることに注意してください。つまり、一度はexport FOOグローバルFOO変数になり、後で変更されても後続の環境に表示されます。

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

おすすめ記事