PATH
我猜想 gnome-terminal 可能在调用 shell 时修改了环境变量。具体来说,$HOME/.local/bin:$HOME/bin
将始终附加到PATH
.
我做了以下实验来证明这一点:
- 打开 gnome 终端
- 遍历“编辑”->“首选项”->“个人资料”并“编辑”您当前的个人资料(对我来说是“未命名”)
- 在“命令”选项卡下,选中“运行自定义命令而不是我的 shell”,并在以下输入区域中填写
sh
.这样,bash
应该以 -way 方式调用sh
,并且它不是登录 shell。 - 为了进一步确保
/etc/profile
,$HOME/.bash_profile
,$HOME/.bashrc
不会被获取,我们暂时重命名这些文件。 (实际上,这些文件不应该已经获取,因为我们正在调用非登录sh
。) 现在,打开一个新的 gnome 终端窗口并运行
echo $PATH
.这是我得到的:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/naitree/.local/bin:/home/naitree/bin
我不明白为什么最后两条路径出现在PATH
.
基于这一事实,我认为存在以下可能的解释:
- the
PATH
是从父进程继承的,在本例中是gnome-terminal-server
. - 它在某个脚本中被修改,该脚本在某个时刻
PATH
神秘地来源。sh
PATH
当 gnome-terminal-server 分叉子进程时, 会被修改。
现在我想我已经排除了#1和#2的可能性:
cat /proc/$PPID/environ
其中$PPID
的 PIDgnome-terminal-server
表明其PATH
变量为/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin
,其中不包含我们要查找的内容。sh
在我们刚刚打开、运行的export -n PATH
中,sh -x
我看不到在这个新的 init 过程中没有任何来源sh
。而且它PATH
很干净:/usr/local/bin:/usr/bin
这给我留下了最后的可能性。
我错过了什么吗? gnome-terminal 是神秘修改的罪魁祸首吗PATH
?
更新:
我只是尝试sh -x
作为自定义命令。打开 gonme-terminal 后,我没有看到任何内容。但是,echo $PATH
说那$HOME/.local/bin
并且$HOME/bin
在那里。
以下是发行版相关信息:
- Fedora 23 (4.4.8-300.fc23.x86_64)
- bash 版本 4.3.42(1)-发布 (x86_64-redhat-linux-gnu)
更新2:
我刚刚尝试过:
- 添加
echo "$PATH"
在 的最开头~/.bashrc
。 - 在默认的非登录 shell 模式下使用 bash 打开 gnome-terminal,使用自定义命令
bash -x
。
根据调试输出,我观察到这~/.bashrc
是脚本源的起点。但$HOME/.local/bin
和甚至$HOME/bin
在那之前就已经存在了PATH
。
答案1
我遇到了类似的问题,终端PATH
最初设置为/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin
.
检查完所有常见的嫌疑人 、~/.bashrc
、~/.bash_profile
、/etc/bashrc
后/etc/profile
,我尝试更改和DefaultEnvironment
中的设置。但我最终还是在./etc/systemd/system.conf
/etc/systemd/user.conf
/usr/local/...
PATH
pam_env
一次偶然的机会,我在尝试找出路径环境的设置位置时遇到了对 的引用。所以我添加了以下行/etc/security/pam_env.conf
:
PATH DEFAULT=/bin:/sbin
重新登录后,终端 shellPATH
就摆脱了讨厌的本地路径。
我很确定默认值来自pam_env
,因为在更改 systemd 配置后,PID 1 和进程都systemd --user
没有环境中的本地路径,但gnome-terminal-server
确实如此。
现代 Linux 正在成为配置的噩梦。
我意识到这不是OP问题的答案。但它似乎足够相关,值得一提。
答案2
根据 Fedora 的评论,将 ~/.local/bin 添加到默认路径,这是 Fedora 特定的更改巴什配置,几年前的。
变化是在 RPM 中制造(不是上游),并且无证。