シェルは一般変数をどこに割り当てますか?

シェルは一般変数をどこに割り当てますか?

ご存知のように、bashシェル自体はプロセスです。

commandを使用すると、シェルは環境変数がある場所にexport a=c変数を動的に割り当てます。a(この環境部分はプロセスのメモリ記述子に記述されています。)ので、a環境部分に変数が割り当てられていると思います。または、コマンドから検索できます。printenv

ただし、 command を使用する場合は をb=f使用echo $bし、変数拡張操作を実行します。結果はですf。この変数はどこから来たのですか?

コマンドを使用すると、echo $aシェルが環境変数セクションでこの変数をロードすることを理解できます。

しかし、commandを使用すると、echo $bシェルはこの変数をどこにロードしますか?プロセスのヒープ部分ですか、それとも別の場所ですか?

答え1

すべてのシェル変数は同じリポジトリにあります。

起動時にすべての環境変数を取得します。

新しいコマンドが開始されると、新しいコマンドの新しい環境が作成されます。エクスポートとしてマークされたすべての変数または元の環境からインポートされた変数は、新しいコマンドに関連付けられた新しい環境に配置されます。

答え2

シェルが実行される環境に影響を与えない値を割り当てる場合(これが可能かどうかはわかりません)。

シェルは、すべての変数(少なくとも作成された変数)に対して内部メモリを使用します。以下を簡単に確認できます。

env - TESTVAR=foo bash

echo $TESTVAR 
foo

TESTVAR=bar

echo $TESTVAR 
bar

echo $$
13833

cat /proc/13833/environ
TESTVAR=foo

関連情報