it-swarm-ja.tech

エクスポートされるシェル変数と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はエクスポートされた変数のみを表示します。

setはbashビルトインであり、envはそうではないことを知っています。

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

46
lesmana

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

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

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
$$
45
Michael Mrozek