为什么我不能打印在env输出中可以看到的变量?

拉尔夫

我对设置一个外壳实例与另一个外壳实例的环境变量感兴趣。所以我决定做一些研究。阅读了许多有关问题后我决定对其进行测试。

我生成了两个正在运行的外壳A和B(PID 420)zsh从外壳程序AI运行以下命令。

sudo gdb -p 420
(gdb) call setenv("FOO", "bar", 1)
(gdb) detach

从外壳B运行时,env我可以看到变量FOO确实设置为bar值。这使我认为FOO已在外壳B的环境中成功初始化。但是,如果我尝试打印FOO,则会出现一个空行,表明未设置FOO。对我来说,这里似乎有矛盾。

这已在我自己的Arch GNU / Linux系统和Ubuntu VM上进行了测试。我还在bash变量甚至未在env中显示的地方对此进行测试这虽然使我感到失望,但如果shell在生成时缓存其环境的副本并仅使用它(在链接的问题之一中建议),则是有道理的。这仍然不能回答为什么zsh可以看到变量。

为什么输出为echo $FOO空?


编辑

输入注释后,我决定进行更多测试。结果可以在下表中看到。在第一列中是将FOO变量注入到的外壳第一行包含该命令的输出,该命令的输出可以在其下面看到。FOO使用:注入变量sudo gdb -p 420 -batch -ex 'call setenv("FOO", "bar", 1)'特定于zsh:的命令zsh -c '...'也已使用bash进行了测试。结果是相同的,为简洁起见,省略了它们的输出。

Arch GNU / Linux,zsh 5.3.1,bash 4.4.12(1)

|      |  env | grep FOO  | echo $FOO |  zsh -c 'env | grep FOO'  |  zsh -c 'echo $FOO'  |         After export FOO          |
|------|------------------|-----------|---------------------------|----------------------|-----------------------------------|
| zsh  |  FOO=bar         |           | FOO=bar                   | bar                  | No Change                         |
| bash |                  | bar       |                           |                      | Value of FOO visible in all tests |

Ubuntu 16.04.2 LTS,zsh 5.1.1,bash 4.3.48(1)

|      |  env | grep FOO  | echo $FOO |  zsh -c 'env | grep FOO'  |  zsh -c 'echo $FOO'  |         After export FOO          |
|------|------------------|-----------|---------------------------|----------------------|-----------------------------------|
| zsh  |  FOO=bar         |           | FOO=bar                   | bar                  | No Change                         |
| bash |                  | bar       |                           |                      | Value of FOO visible in all tests |

以上似乎暗示结果是不可知的分布。这并不能告诉我更多,zsh并且可以bash不同地处理变量的设置。此外,export FOO在这种情况下,根据外壳的不同,其行为也有很大不同。希望这些测试可以使其他人明白。

斯蒂芬·查泽拉斯(Stephane Chazelas)

大多数弹不使用getenv()/ setenv()/ putenv()API。

启动时,它们为收到的每个环境变量创建shell变量。这些将存储在内部结构中,这些内部结构需要携带其他信息,例如变量是否已导出,只读……它们不能environ为此使用libc

同样,因为这个原因,他们不会使用execlp()execvp()执行命令,但拨打execve()直接系统调用,计算envp[]基于其输出变量的名单上排列。

因此,在您的中gdb,您需要在该Shell内部变量表中添加一个条目,或者可能调用正确的函数,该函数将使其解释export VAR=value为它自己更新该表代码。

至于为什么你看到之间的差异bash,并zsh当你调用setenv()gdb,我怀疑那是因为你所呼叫setenv()的外壳初始化之前在进入,例如main()

您会注意到,bash'smain()int main(int argc, char* argv[], char* envp[])(并bash从中映射那些env vars中的变量envp[]),而zsh's是int main(int argc, char* argv[])zsh从中获取变量environsetenv()确实会修改,environ但不能envp[]就地修改(在多个系统上为只读,以及这些指针指向的字符串)。

无论如何,environ在启动后读取外壳程序之后,使用setenv()将无效,因为外壳程序之后将不再使用environ(或getenv())。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我不能连续看到屏幕输出?

来自分类Dev

为什么我可以看到后台进程的输出?

来自分类Dev

为什么我不能打印在函数内部声明的变量?

来自分类Dev

为什么Python中的函数可以在封闭范围内打印变量,但不能在赋值中使用它们?

来自分类Dev

为什么我无法在节点js中更新env变量

来自分类Dev

为什么我不能在班级中访问变量。Python

来自分类Dev

为什么我不能从开关内的变量中减去?

来自分类Dev

为什么我不能访问全局变量中的值

来自分类Dev

为什么我不能在定义中定义变量?

来自分类Dev

为什么我不能打印数组?

来自分类Dev

为什么我不能调用函数但我可以在控制台中打印它?javascript

来自分类Dev

为什么我不能在循环内打印用户提供的变量?

来自分类Dev

AngularJS:为什么我不能直接打印模型变量(而不是使用$ modelValue属性)?

来自分类Dev

为什么我的程序不能使用float变量,但是可以使用int变量?

来自分类Dev

为什么在c中打印String Array不能提供相同的输出?

来自分类Dev

为什么我不能继承此变量?

来自分类Dev

为什么我不能取变量的地址?

来自分类Dev

我可以使用printenv在服务器上看到env变量,但无法在php中获取它们

来自分类Dev

当我要打印输出时,为什么在for循环中定义的变量超出上限?

来自分类Dev

为什么我无法获得在AngularJS Videogular中可以看到的元素的引用?

来自分类Dev

为什么在我的Perl脚本打印输出中打印空白行

来自分类Dev

为什么scanf()函数可以打印到我的标准输出流?如何抑制这种行为?

来自分类Dev

为什么 Ubuntu 可以看到我的一个 Windows 驱动器,而不能看到另一个?

来自分类Dev

为什么此“ at”命令不能打印到标准输出?

来自分类Dev

为什么此“ at”命令不能打印到标准输出?

来自分类Dev

为什么在env或printenv的输出中不显示语言环境变量?

来自分类Dev

为什么我的变量在终端输出。重击

来自分类Dev

为什么在输出中此打印“无”?

来自分类Dev

为什么我不能从函数中更改env.hosts?

Related 相关文章

  1. 1

    为什么我不能连续看到屏幕输出?

  2. 2

    为什么我可以看到后台进程的输出?

  3. 3

    为什么我不能打印在函数内部声明的变量?

  4. 4

    为什么Python中的函数可以在封闭范围内打印变量,但不能在赋值中使用它们?

  5. 5

    为什么我无法在节点js中更新env变量

  6. 6

    为什么我不能在班级中访问变量。Python

  7. 7

    为什么我不能从开关内的变量中减去?

  8. 8

    为什么我不能访问全局变量中的值

  9. 9

    为什么我不能在定义中定义变量?

  10. 10

    为什么我不能打印数组?

  11. 11

    为什么我不能调用函数但我可以在控制台中打印它?javascript

  12. 12

    为什么我不能在循环内打印用户提供的变量?

  13. 13

    AngularJS:为什么我不能直接打印模型变量(而不是使用$ modelValue属性)?

  14. 14

    为什么我的程序不能使用float变量,但是可以使用int变量?

  15. 15

    为什么在c中打印String Array不能提供相同的输出?

  16. 16

    为什么我不能继承此变量?

  17. 17

    为什么我不能取变量的地址?

  18. 18

    我可以使用printenv在服务器上看到env变量,但无法在php中获取它们

  19. 19

    当我要打印输出时,为什么在for循环中定义的变量超出上限?

  20. 20

    为什么我无法获得在AngularJS Videogular中可以看到的元素的引用?

  21. 21

    为什么在我的Perl脚本打印输出中打印空白行

  22. 22

    为什么scanf()函数可以打印到我的标准输出流?如何抑制这种行为?

  23. 23

    为什么 Ubuntu 可以看到我的一个 Windows 驱动器,而不能看到另一个?

  24. 24

    为什么此“ at”命令不能打印到标准输出?

  25. 25

    为什么此“ at”命令不能打印到标准输出?

  26. 26

    为什么在env或printenv的输出中不显示语言环境变量?

  27. 27

    为什么我的变量在终端输出。重击

  28. 28

    为什么在输出中此打印“无”?

  29. 29

    为什么我不能从函数中更改env.hosts?

热门标签

归档