如果我在 中设置一个变量/etc/environment
,它似乎只适用于 中的管理员sudo su
。
我怎样才能让变量适用于所有人?尤其是当他们在终端中时?设置/etc/enviroment
不适用于 bash 吗?
答案1
更新/etc/environment
仅在下一个会话中起作用,不会自动重新加载。
这意味着您无法更改其他用户已经开始的会话。
如果您想要“重新加载”其中的内容,/etc/environment
则需要以下命令:
source /etc/environment
但同样,它只对您自己的当前会话起作用,其他用户在启动新会话或在自己的会话中运行上述命令之前不会受到影响。
答案2
总结
这些配置文件是否全球的(/etc/environment
,/etc/profile
) 或者用户特定(~/.profile
,~/.bashrc
)仅在下次登录/会话时处理。
这全球的文件适用于所有用户(不仅仅是 root 用户)...但您必须重新启动登录会话才能看到环境中反映的更改。这可以通过su
您观察到的调用来实现...或者通过注销/登录或重新启动来实现。您可以su
对非 root 用户执行此操作,您会看到他们的环境也发生了变化。
之所以需要重新启动或再次登录才能获取全局环境,是因为环境是从父进程继承的,而您运行的其他所有程序的根进程都是您的登录 shell...因此,如果您的登录 shell 没有环境...那么在登录 shell 中启动的进程也没有环境。当然,您可以在启动单个进程时为其设置/更新环境,但您必须为登录 shell 设置环境并重新启动所有子进程,才能让它们看到更改。
全局环境
正如其他人提到的,您需要重新启动或注销/登录才能使/etc/profile
更改/etc/profile.d/*.sh
生效/etc/environment
。
这是因为虽然这些文件指定了全局环境……但它们仅在登录时运行一次,因此现有登录/会话不会反映对这些文件的更改。重新启动会“重置”每个人的登录,迫使他们选择新环境。
在您自己的登录会话中,您可以source /etc/profile
在不重新启动或注销/登录的情况下获取更改......但这只会影响您自己的会话和在您的会话中运行的新进程。
笔记而且其中没有变量插值/etc/environment
(它不是脚本)所以你不能PATH="$PATH:/my/custom/path"
在那里做类似的事情。
笔记另外,/etc/profile
并且/etc/profile.d/*.sh
仅在登录会话中运行,因此配置的环境将无法用于系统非登录帐户(即,如果您尝试为在登录 shell 之外运行的守护进程设置环境变量)。
笔记这bashrc
对于设置整个登录 shell 的环境没有用,但对于 bash shell 和子进程来说却很有用...因此对于真正的“全局”或“用户全局”,您可能希望将环境配置放在/etc/profile
或/etc/profile.d/my-custom-env.sh
或中~/.profile
。其他 shell(例如 zsh)也有自己的配置文件,因此如果/当您切换 shell(或让系统上的其他用户使用不同的 shell)时,bashrc 中非 bash 特定的环境配置会导致问题或混淆。
安装新程序并需要指定一些环境才能正常运行是一个常见问题。全局环境是一个答案,但通常需要重新启动,这对于服务器和自动配置/配置用例来说并不理想。您应该问自己这是否真的是系统上所有用户和程序都需要的变量,或者它是否真的只是您需要向特定用户或程序提供的东西。
对于特定用户
查看在配置文件中或用户主目录中的 bashrc 中包含环境(例如~/.profile
~/.bashrc
),具体取决于您是否希望将其用于交互式、登录 shell、仅限 bash 等。
请记住,这还需要重新启动或注销/登录,以使环境更改可供用户登录会话中的所有进程使用。用户可以source ~/.profile
……但这是在终端内完成的,并且只会更新该终端会话和子进程内的环境……不一定适用于用户的整个登录环境。
对于特定程序,有几个选项。
一种方法是在运行命令时仅提供环境:
VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE" /path/to/program --opt1 --op2
[Service]
如果你使用 systemd,你也可以在 unit/service文件中指定环境Environment=VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE
这个选项可能感觉很笨重,因为您必须在每次运行程序时指定环境,但如果该环境实际上只是该程序需要......这确实是最好的方法,您应该习惯它而不是将所有内容转储到 bashrc 或配置文件中。
如果您没有使用 systemd 或 init 来设置环境并运行程序……那么您当然也可以用 bash 脚本包装程序执行,并在其中保存包括环境设置在内的完整命令以方便使用。
参考:
- https://help.ubuntu.com/community/EnvironmentVariables#System-wide_environment_variables
- https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html
- https://www.freedesktop.org/software/systemd/man/systemd.exec.html#Environment=
这里还有一个非常详细的答案,我建议你阅读:https://askubuntu.com/a/247769/824160
答案3
在下创建自定义 shell 脚本
/etc/profile.d/
在创建的脚本中添加全局环境变量,重新启动机器,然后每个人都可以使用它。
答案4
添加变量对/etc/environment
我来说确实有效。
然而我确实需要在更改后重新启动/etc/environment
才能使更改生效。简单地关闭并重新打开终端窗口是不够的。