如何对 $PATH 进行永久、系统范围的更改

如何对 $PATH 进行永久、系统范围的更改

从学术角度考虑,我已经做到了sudo mv /bin /foo。我没有停下来问问题,我掌控了自己的命运并做到了。

如果我想永久更改整个系统$PATH以反映此更改,我该怎么做?这包括:

  • 交互式外壳
  • 非交互式 shell
  • GUI 登录
  • 系统服务
  • sudo 使用

我之所以问这个问题,是因为对于正确的做法,人们还一头雾水。这个问题的答案各不相同:

  • 编辑~/.bashrc(不会影响例如bash --norc
  • 编辑~/.profile(仅影响登录 shell)
  • 编辑/etc/environment(不影响 sudo;有时 PATH 似乎不在这里?)

是否有其他核心系统实用程序可能会因尝试使用$PATH以其他方式或我未在此处介绍的位置定义的某些副本而导致问题?$PATH使用 sudo 时如何覆盖?

$PATH统治一切的人住在哪里?我该如何添加/foo它?

我知道这个问题已经被问过很多次了,但是有太多不同的问题和答案,其中许多已经过时或仅涵盖某些情况。

答案1

您可能无法从 $PATH 中永久删除 /bin,因为太多脚本会重置它,但您可以做一些事情:

将 /bin 移动到 /foo 然后将 /foo 符号链接到 /bin:

以 root 身份运行以下命令:

cd /; mv bin foo; ln -s foo bin

(然而这就引出了一个问题,如果您真的想将 /bin 的内容放在 /foo 中,为什么不直接将 /bin 符号链接到 /foo 呢?)

然后,您可以在 /etc/rc.local 中设置自定义 PATH。无论是否有人登录,它都会在启动时获取。如果文件不存在,则需要创建它。Systemd 应该会选择它。 man systemd-rc-local-generator了解更多信息。

答案2

我想说编辑/etc/environment是最好的“系统范围”选项。

但是,sudo使用安全路径,定义在:/etc/sudoers

因此,我认为编辑这两个(或仅其中一个)是系统范围路径更改的最佳方式。

其他环境变量(例如JAVA_HOME)也可以在中设置/etc/environment

相关内容