debian 交互式 shell 不调用 .profile

ach*_*lle 1 bash environment-variables

我刚刚安装了一个全新的 debian buster:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 10 (buster)
Release:    10
Codename:   buster
Run Code Online (Sandbox Code Playgroud)
$ 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

[...]
Run Code Online (Sandbox Code Playgroud)
$ whoami 
zozo
$ su 
Password:
# id -u 
0
# printenv | grep -i ^path 
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Run Code Online (Sandbox Code Playgroud)

如果我以 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"
Run Code Online (Sandbox Code Playgroud)

但问题仍然存在:

Ctrl+D回到普通用户

然后

$ su 
password: 

# printenv | grep -i ^path
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Run Code Online (Sandbox Code Playgroud)

所以我做了一些搜索:6.2 Bash Startup Files

然后

if [ -z "$PS1" ];then echo NOT interactive shell ;else echo INteractive shell ;fi
INteractive shell
Run Code Online (Sandbox Code Playgroud)

它说:

当 Bash 作为交互式登录 shell 被调用时,[...] 它首先读取并执行 [...] /etc/profile [...]。在 [...] 之后它寻找 [...] ~/.profile ...

所以我想知道为什么它不PATH~/.profile(~/.profile不被调用/加载) 加载。当然,如果我把它放进去~/.bashrc,它就起作用了。

因此,最后,默认情况下,没有用于关闭或重新启动等基本命令的路径。

此外,我意识到像 一样systemctl本质上是管理命令的工具位于/usr/bin而不是/sbin/usr/sbin (以及许多其他管理命令,如getfacl, setfacl... 但这是另一个问题)。

我应该在这里错过了一些东西。

sch*_*ily 5

只有登录 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 窗口中启动所有 shell,以argv[0]开头,-因此,这些 shell 将自己标识为登录 shell。如果您没有发生这种情况,则您的 X11 环境可能已损坏。

如果您使用 启动超级用户会话su,这绝对不会启动登录 shell。如果您希望这样的 shell 表现得像登录 shell,请调用:

su -
Run Code Online (Sandbox Code Playgroud)

你试过吗?