我对从另一个 shell 实例设置一个 shell 实例的环境变量感兴趣。所以我决定做一些研究。在阅读了一些关于此的问题后,我决定对其进行测试。
我生成了两个 shell A 和 B(PID 420),都运行zsh
. 从 shell AI 运行以下内容。
sudo gdb -p 420
(gdb) call setenv("FOO", "bar", 1)
(gdb) detach
Run Code Online (Sandbox Code Playgroud)
从 shell B 运行时,env
我可以看到变量 FOO 确实设置了 bar 值。这让我认为 FOO 已经在 shell B 的环境中成功初始化。但是,如果我尝试打印 FOO,我会得到一个空行,暗示它没有设置。对我来说,感觉这里有一个矛盾。
这已在我自己的 Arch GNU/Linux 系统和 Ubuntu VM 上进行了测试。我还测试了这个bash
变量甚至没有出现在 env 中的地方。这虽然让我失望,但如果 shell 在生成时缓存其环境的副本并且只使用它(这是在一个链接问题中建议的),这是有道理的。这仍然没有回答为什么zsh
可以看到变量。
为什么输出为echo $FOO
空?
在评论中输入之后,我决定进行更多测试。结果见下表。第一列是FOO
变量被注入的外壳。第一行包含可以在其下方看到其输出的命令。变量FOO
注入使用:sudo gdb -p 420 -batch …