所以有 $PWD、$PATH、$USERNAME 等等。我一直在开发自己的 shell,今天刚刚引入了环境变量。我这样做的方法是创建名为 pwd、path 等的字符串,因此当有命令回显时,比如 $PWD,我告诉它打印 pwd。这和 bash 做的事情是一样的吗?我还没有设置环境变量的规定,但我想我会努力做到这一点。我的主要问题是实际的 shell 在哪里以及如何执行此操作。
另一个有些相关的问题, printenv 与这一切有何关系?因为 printenv 是一个二进制文件,它总是打印 bash 环境变量,而不是我当前用来运行它的 shell(显然,它如何检测我设置为我的路径的程序中的字符串)和 pwd)那么它从哪里得到这些呢?
答案1
shell 可以按照它想要的任何方式存储环境变量。这并不真正相关。相关的是 shell 应该能够printenv
通过系统调用将环境传递给子进程(包括 )execve
。
答案2
看男人7环境。当你的 shell 执行另一个进程时——通过任何方式执行(3) -- 该进程继承其前身的环境。一种方便的 shell 设计可能是保留两个列表:导出的和非导出的 shell 变量。那些导出的可以在 shell 自己的环境中维护普特恩夫(3) 并由 shell 创建的任何进程自动继承。那些未导出的可能位于单独的列表中,只能由 shell 访问。
如果你对这种事情感兴趣,你可能会发现Linux 编程接口Michael Kerrisk 的一个有用的参考。