シェル変数と環境変数の両方が同じ名前を持つ場合、どちらが優先されますか?

シェル変数と環境変数の両方が同じ名前を持つ場合、どちらが優先されますか?

Bashに次のように入力します。

env | grep USER

そして

set | grep USER

同じユーザー名を2回指定します。

たとえば、入力中にecho $USERシェルまたは環境変数が表示されるかどうかはどうすればわかりますか?

答え1

~のためPOSIX互換シェル(Bashを含む)標準は次のように言います。

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

答え2

これらは同じ変数です。他のほとんどのプログラミング言語とは異なり、シェルは環境変数とシェル変数が同じ名前空間を共有します。シェルでは、環境変数は.exportを使用してエクスポートされたシェル変数ですexport

たとえば、前の質問に対する私の答えをご覧ください。」シェル変数と環境変数の使い方の違いは何ですか?

答え3

シェル変数は、システム全体ではなく現在のシェルでのみ使用できます。一方、環境変数はシステム全体で使用できます。通常、シェル変数は小文字で作成され、環境変数は大文字で作成されます。シェル変数をエクスポートして環境変数として機能させることができます。

関連情報