
ご存知のように、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