我一直在尝试深入了解 shell 范围和环境。我一直在阅读有关如果我们export VARIABLE=VALUE
这样做的话它将如何在子外壳中可用的内容。所以我想问一个我想到的问题。
如果我理解正确的话,如果我们通过脚本文件执行二进制程序,它将能够看到环境变量,因为通过linux(假设是 debian )中的终端设置的环境变量对于脚本文件运行的所有程序都是可见的。
所以我的问题和困惑是,是否有一个 shell 是所有 shell 的父级。我对层次结构有点困惑。当我在 debian 中打开终端并输入 时export VARIABLE=VALUE
,这对所有脚本文件都可见,即使我通过双击桌面来运行它们?
我希望我的问题并不含糊并且适合服务器故障。
答案1
所有进程(无论是 shell 还是其他进程)都形成一个层次结构。环境变量从父进程传递到子进程,除非父进程采取显式操作来管理子进程的环境。在大多数系统中init
,该进程位于进程树的根部,但情况可能有所不同,例如在嵌入式环境中。运行会pstree -a
向您显示树中的所有进程。
子进程设置的环境变量既不会传播到父进程也不会传播到同级进程,因此在终端窗口中导出变量只会影响从该窗口内启动的进程。因此,你的问题的答案是否定的。
答案2
说了这么多;不,作为 X11 会话的子进程运行的 shell 无法更改 X11 会话的环境,该会话将成为您通过双击桌面启动的进程的父进程(或可能是祖进程)。
一种常见的解决方法是以连接到某种配置机制并获取所需设置的方式编写可双击工具。这可能只是您主目录中的配置文件,或者某种设置守护程序。现代 X11 桌面环境开箱即用地运行这些东西;也许可以从看开始dbus
。
当然,这仅对专门设计用于在可用这些设施的环境中运行的工具有帮助。在一般情况下,您可能希望让 Java 程序读取系统范围的配置文件,例如/etc/eat_memory_and_crash.conf
(假设您的 Java 程序名为eat_memory_and_crash
;尽管在 Java 生态系统中,我认为这将是一个 XML 文件)。