假设我想导出一个路径,FOOBAR
使更改不仅立即生效且在所有地方都生效,而且永久生效。我的目标是获得一个命令列表,这些命令可以在活动的 shell 会话中手动输入,也可以在 shell 脚本中执行(反过来,脚本可以通过 shell 或 GUI 文件管理器等执行)。
旧流程不需要了解任何变化。
以下是我希望发生的事情FOOBAR
:
- 添加新值而不覆盖以前的值。
- 使更改在当前用户上下文中在整个系统范围内可访问(对于任何程序或 shell 会话,无论它如何启动)。
- 使更改立即生效(即无需注销等)
我当前的方法是将值作为设置命令导出到.profile
和.bashrc
:
echo "export FOOBAR=$FOOBAR:$HOME/example/" >> $HOME/.profile;
echo "export FOOBAR=$FOOBAR:$HOME/example/" >> $HOME/.bashrc;
source $HOME/.profile;
如何才能改进:
- 它确实有效,但是是否存在会失败的情况以及我该如何避免它们(即,ubuntu 用户是否会进行任何常见的过程或操作等,从而破坏我的导出路径)?
- 这种方法是否存在安全问题?如何解决?
- 为了使其尽可能通用(在 ubuntu 家族内),是否还有其他碰撞或负面后果需要我注意?
答案1
- 应该是
~/.profile
或.bashrc
。不能同时是 ,因为/.bashrc
是从 加载的~/.profile
。 - 非登录 shell 将仅加载
~/.bashrc
而不会加载/etc/profile
、~/.bash_profile
或~/.bash_login
因此~/.profile
(如果担心这一点则~/.profile
不会使用)。 - 没有 shell 的非登录用户将加载 处设置的配置
$BASH_ENV
。尚未找到 加载的内容,但~/.bashrc
应该是其中之一。
关于你的第一点:
- 这可能不是一个好主意。而且可能不是它的工作原理。当您重新加载环境变量时,它们将从空开始(假设您的意思是在重新加载它们时它们不应该为空 ;-) )。
关于你的第二点:
- 如果您希望所有用户都使用
/etc/profile
或/etc/environment
。/etc/环境是系统范围环境变量的正确位置。此外:这排除了~/.profile
。
关于你的第三点:
/etc/environment
不需要重启。它需要重新登录。并且应该通过重新登录来完成;您可以再次获取它,但这仅适用于您的会话以及获取它之后启动的进程。不适用于已经运行的进程。
尽管如此
. /etc/environment
是一种重新加载所有变量的方法。但同样:这不会重置当前正在运行的进程的变量。只针对当前 shell 和新启动的进程。
关于第4、5、6点:
我唯一能看到的问题是它可能会失控。如果你将它添加到~/.bashrc
源变量中 10 次、20 次,你的变量就会被相同的部分淹没。
确实没有,没有。没有安全风险。