Answers:
这些配置文件是否全球(/etc/environment
,/etc/profile
)或用户特定的(~/.profile
,~/.bashrc
)只得到在下次登录/会话处理。
在全球性的文件适用于所有用户(不只是根)......但你必须重新启动你的登录会话看到反映在环境的变化。这可以通过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和子进程来说……...对于真正的“ global”或“ user global”,您可能希望将环境配置放在/etc/profile
or /etc/profile.d/my-custom-env.sh
或中~/.profile
。其他外壳程序(例如zsh)也具有自己的配置文件,因此如果/当您切换外壳程序时(或系统上的其他用户使用不同的外壳程序),bashrc中非bash特定的环境配置将引起问题或混乱。
安装新程序是一个常见问题,需要指定一些环境才能使其正常运行。全局环境是一个解决方案,但通常需要重新启动,这对于服务器和自动配置/配置用例而言并不理想。您应该问问自己,这是否真的是系统上所有用户和程序都需要的变量,还是只不过是您需要提供给特定用户或程序的变量。
查看是否在用户主目录(例如~/.profile
~/.bashrc
)中将profile或bashrc中的环境包括在内,具体取决于您是否希望将其用于交互式,登录shell,仅bash等。
请记住,这还需要重新启动或注销/登录,以使环境更改可用于用户登录会话中的所有进程。用户可以source ~/.profile
...但是可以在终端中完成,并且仅更新该终端会话和子进程中的环境...不一定要针对用户的整个登录环境。
一种是仅在运行命令时提供环境:
VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE" /path/to/program --opt1 --op2
如果您使用的是systemd,还可以在的单位/服务文件中[Service]
使用Environment=VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE
这个选项可能很笨拙,因为每次运行程序时都必须指定环境,但是如果确实仅该程序需要该环境...这确实是最好的方法,您应该习惯它而不是丢弃所有内容放入bashrc或配置文件中。
如果您没有使用systemd或init来设置环境并运行程序...那么,当然,您也可以使用bash脚本包装程序执行,在其中保存完整的命令(包括环境设置)以方便使用。
这里还有一个非常详细的答案,建议您阅读:https : //askubuntu.com/a/247769/824160
添加一个变量/etc/environment
确实对我有用。
但是我确实必须在更改后重新启动/etc/environment
才能使更改生效。仅关闭并重新打开终端窗口是不够的。
source /etc/environment
重新加载它。