シェル変数と環境変数、どちらが同じ名前の場合にどちらが好ましいですか?


10

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

env | grep USER

そして

set | grep USER

両方の時間に同じユーザー名を与えます。

私が知っている方法、例えばときタイピングecho $USERシェルまたは環境変数が表示された場合はどうなりますか?

回答:


14

以下のために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
Bourneシェルは、cshと同様に、環境変数からシェル変数を初期化することに注意してください。ただし、シェル変数を変更しても、エクスポートしない限り、対応する環境変数には影響しません。これは、Kornシェルによって破壊された(POSIXによって指定された)ものです。そのため、スクリプトで実行するコマンドに影響を与える可能性があるenv変数を変更しないように、現在使用しているシェル変数の名前に注意する必要があります。
ステファンChazelas

4

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

たとえば、前の質問への私の回答「シェル変数と環境変数の使用法の違いは何ですか?」を参照してください


私はあなたの説明を読み直します、あなたの答えを理解する前に、私はいくつかのことを最初に学ぶ必要があります。
シャーカント2017年

@sharkantまったく心配ありません。混乱している場合は、私に教えてください。明確にするように努めます。イルッカチュの答えもいいです。
クサラナンダ

いいえ、私はそうは思いません、あなたは良い説明スタイルを持っています、それはまだ彼らを大事にすることができない私の知識の欠如だけです。
シャーカント2017年

2

シェル変数は現在のシェルにのみ使用でき、システム全体では使用できません。一方、環境変数はシステム全体で使用できます。慣例により、シェル変数は小文字で記述され、環境変数は大文字で記述されます。シェル変数を環境変数として機能させることができます。エクスポートするだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.