環境変数とシェル変数の違い


8

環境変数は子プロセスで継承されると言われていますが、シェル変数は継承されていません。ただし、次のテストでは、シェル変数が環境変数と同じように子プロセスで表示されることを示しています。違いはなんですか?

> bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
> export TEST="ENV_TEST"    #env var
> sh -c "echo \$TEST"
ENV_TEST
> TEST="SHELL_TEST"         #shell var
> sh -c "echo \$TEST"       #shell var is seen in child process
SHELL_TEST

回答:


9

2番目の割り当てでTEST="SHELL_TEST"は変数はエクスポートされません。それはまだ「子供たちに受け継がれる」とマークされています。また、子が継承する値は、現在親に設定されている値です。
言い換えれば、2番目の割り当てではTEST、シェル変数にステータスが戻されることはなく、その用語によると、環境変数のままです。

子プロセスで設定を解除するには、それをエクスポート解除する必要があります。

$ typeset +x TEST
$ sh -c 'echo $TEST'

$

こんにちはマット、あなたの答えをありがとう。だから私の理解(TESTという2つの変数があり、1つは環境変数、もう1つはシェル変数、shell var TEST shadows env var TESTです)は正しくありません、Bashには1つの変数しかありません、それは常にシェル変数であり、エクスポートするように設定し、環境変数として機能します。これはBashに固有であり、実装に依存していますか、それともすべてのシェルで共通です。ありがとうございました。

「ユニバーサル」については不明ですが、少なくともbash、ksh、zshでは同じように機能します。
マット

2
@ningこれは、すべての最新のPOSIX / Bourneスタイルのシェル(ash、ksh、bash、zsh)のしくみです。Bourneシェルの古いバージョンでは、エクスポートされたシェル変数を変更しても環境の値は変更されませんでしたが、これ以上遭遇することはほとんどありません。Cshの動作は異なりますが、旧式の環境ではまだこの問題に遭遇する可能性がありますが、これもしばらくの間は使用されていません。
Gilles「SO-悪をやめる」

@ギレス何が起こっているのか、その理由を明確にしていただきありがとうございます。誰かが言ったように、すべてのUnix開発者も歴史家であるべきです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.