回答:
以下のためにPOSIX互換のシェル(バッシュを含む)、標準氏は述べています:
2.5.3シェル変数
変数は環境から初期化されるものとします[...] 変数が環境から初期化される場合、変数はすぐにエクスポート用にマークされます。組み込みの特別なエクスポートを参照してください。新しい変数は、変数の割り当てなどで定義および初期化できます。
そして約export
:
export name[=word]...
シェルは、指定された名前に対応する変数にエクスポート属性を与えます。これにより、それらはその後実行されるコマンドの環境に置かれます。
したがって、シェルの観点からは、変数のみがあります。それらのいくつかは、シェルが開始されたときの環境からのものである場合もあれば、シェルが開始するプロセスの環境にエクスポートされる場合もあります。
(「環境」とは、実際には、起動時にプロセスに渡される一連の文字列です。プロセスの実行中は、それを使って好きなことを何でも行うことができ、使用し、無視し、上書きします。そして、プロセスが渡すもの他のプロセスを開始するときは、さらに別のことになる可能性がありますが、もちろんすべての環境変数をもう一度渡すのが普通です。)
などの非POSIXシェルを使用している場合はcsh
、状況が異なる場合があります。
$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit
これらは1つの同じ変数です。シェルでは、他のほとんどのプログラミング言語とは異なり、環境変数とシェル変数は同じ名前空間を共有します。シェルでは、環境変数はでエクスポートされたシェル変数ですexport
。
たとえば、前の質問への私の回答「シェル変数と環境変数の使用法の違いは何ですか?」を参照してください。
シェル変数は現在のシェルにのみ使用でき、システム全体では使用できません。一方、環境変数はシステム全体で使用できます。慣例により、シェル変数は小文字で記述され、環境変数は大文字で記述されます。シェル変数を環境変数として機能させることができます。エクスポートするだけです。