linux - 在不重启 Ubuntu 的情况下全局设置环境变量

标签 linux bash shell ubuntu

我知道可以通过添加条目来设置系统范围的环境变量

/etc/environment

/etc/profile

但这需要系统重启或 X 重启。

是否可以在 Ubuntu/Linux 中设置环境变量,以便在不重启操作系统或注销用户的情况下立即在整个系统范围内使用?

最佳答案

简单的答案是:您一般不能这样做

为什么没有通用的解决方案?

“为什么?”需要更详细的解释。在 Linux 中,环境是特定于进程的。每个进程环境都存储在专门为此进程分配的特殊内存区域中。

As an aside: To quickly inspect the environment of a process, have a look at /proc/<pid>/env (or try /proc/self/env for the environment of the currently running process, such as your shell).

当一个(“父”)进程启动另一个(“子”)进程(通过 fork(2) )时,父进程的环境被复制以产生子进程的环境。此后这两个环境之间没有继承式关联,它们是完全独立的。因此,没有我们可以改变的“全局”或“主”环境来实现您想要的。

为什么不简单地更改所有正在运行的进程的每个进程环境?环境的内存区域位于明确定义的位置(基本上就在为堆栈分配的内存之前),因此您无法轻松扩展它,而不会破坏进程的其他关键内存区域。

特殊情况下可能的半解

也就是说,可以想象几种特殊情况,您确实可以在这些情况下实现您想要的。

  • 最明显的是,如果您进行“大小中立”更改,您可能会修补所有进​​程的所有环境。例如,替换每个 USER=foo环境变量(如果存在),带有 USER=bar .我担心这是一个相当特殊的情况。

  • 如果您真的不需要更改所有进程的环境,而只需更改一类众所周知的进程的环境,则可能会采用更有创意的方法。 Vorsprung's answer是仅使用 Bash 进程就可以做到这一点的令人印象深刻的演示。

可能还有许多其他特殊情况,其中有可能的解决方案。但如上所述:一般情况下没有解决方案。

关于linux - 在不重启 Ubuntu 的情况下全局设置环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8677504/

相关文章:

regex - ls 和 find 之间的正则表达式差异以搜索 1 个字符串或另一个字符串

java - 从 java 应用程序执行 Lynx

mongodb - 如何通过shell脚本执行mongo命令?

linux - Linux 中的复制/粘贴存储

bash - Visual Studio Code "Git not found"

bash - shell 脚本 - 有没有办法将数字转换为字符?

bash - 如何使用 bash 删除和替换终端中的最后一行?

python - 获取到目前为止在 Python 解释器 session 中输入的代码

bash - 为什么打印的 null 与条件中的文字 null 的处理方式不同?

c - C 中的 setgid() 调用不起作用