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
... 但这是另一个问题)。
我应该在这里错过了一些东西。
只有登录 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)
你试过吗?