debian 交互式 shell 不调用 .profile

debian 交互式 shell 不调用 .profile

我刚刚安装了一个全新的 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而不是/sbinor /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 -

你尝试过吗?

相关内容