如你所知,bash shell 本身也是进程。
如果我使用 command export a=c
,那么 shell 会动态地将变量分配a
到环境变量所在的位置。(此环境部分在进程的内存描述符中描述)所以,我认为变量a
被分配到环境部分。另外,也可以从命令中检索printenv
但是,当我使用 command b=f
,然后使用echo $b
,然后进行变量扩展操作。所以结果是f
。这个变量从哪里来?
如果我使用 command echo $a
,那么我可以理解 shell 从环境变量部分加载此变量。
但是如果我使用 command echo $b
,shell 在哪里加载这个变量?它是进程的堆部分还是其他地方?
答案1
所有 shell 变量都位于同一存储中。
启动时,将导入所有环境变量。
当启动新命令时,将为该新命令创建一个新环境。所有标记为导出的变量或已从原始环境导入的变量都将放入特定于新命令的新环境中。
答案2
如果您分配一个不影响运行 shell 的环境的值(我不知道这是否可能)。
shell 将内部存储器用于其所有变量(至少对于写入的变量)。你可以很容易地看到:
env - TESTVAR=foo bash
echo $TESTVAR
foo
TESTVAR=bar
echo $TESTVAR
bar
echo $$
13833
cat /proc/13833/environ
TESTVAR=foo