我刚刚安装了一个全新的 Debian Buster:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 10 (buster)
Release: 10
Codename: buster
$ cat /etc/profile
[..]
if [ "`id -u`" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH
[...]
$ whoami
zozo
$ su
Password:
# id -u
0
# printenv | grep -i ^path
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
如果我以 root 身份运行:
# grep -i path /etc/profile.d/*
无输出# grep -i path ~/.profile
无输出# grep -i path ~/.bashrc
无输出
在 Debian 系统上,没有~/.bash_profile
也没有~/.bash_login
vi ~/.profile
PATH="/usr/bin:/bin:/usr/sbin:/sbin"
但问题仍然存在:
Ctrl+D返回普通用户
然后
$ su
password:
# printenv | grep -i ^path
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
所以我做了一些搜索:6.2 Bash 启动文件
然后
if [ -z "$PS1" ];then echo NOT interactive shell ;else echo INteractive shell ;fi
INteractive shell
它说:
当 Bash 作为交互式登录 shell 被调用时,[...] 它首先读取并执行 [...] /etc/profile [...]。在 [...] 之后,它会查找 [...] ~/.profile ...
所以我想知道为什么它不加载PATH
(~/.profile
不~/.profile
调用/加载)。当然,如果我把它放进去~/.bashrc
,它就会起作用。
因此,最后,默认情况下,没有关闭或重新启动等基本命令的路径。
此外,我意识到像 之类的工具systemctl
本质上是管理命令,/usr/bin
而不是/sbin
or /usr/sbin
(以及许多其他管理命令,例如getfacl
, setfacl
...但这是另一个问题)。
我应该在这里错过一些东西。
答案1
只有登录 shell 会读取/etc/profile
和~/.profile
。
您可以通过致电 来检查这一点echo $0
。
如果输出以减号开头(例如-bosh
),则这是一个登录 shell。
因此,最好在更改后注销并重新登录/etc/profile
诸如/etc/sh.shrc
、/etc/bash.bashrc
或 $HOME 中的对应文件由任何交互式 shell,不仅仅是登录 shell。
由于您的 shell 不是登录 shell,因此您应该尝试找出发生这种情况的原因。如果您通过文本控制台或从文本控制台登录ssh
,并且您的 shell 未标记为登录 shell,那么您绝对应该针对您的发行版制作错误报告。
正确的 X11 环境会在新创建的 shell 窗口中以argv[0]
开头启动所有 shell -
,因此,此类 shell 将自己标识为登录 shell。如果您没有发生这种情况,您的 X11 环境可能会损坏。
如果您使用 启动超级用户会话su
,这绝对不会启动登录 shell。如果您希望这样的 shell 表现得像登录 shell,请调用:
su -
你尝试过吗?