现象

使用一些命令, 比如 usermod, root和sudo都不能执行, 报错找不到命令, 但命令确实存在于 /usr/sbin:/sbin

原因

命令解析时机
当运行 sudo echo $PATH 时,发生的是:

  1. **Shell 先展开 $PATH**(在当前shell环境中)
  2. 然后执行 sudo echo [已经展开的PATH]
    所以实际上看到的是当前shell的PATH,而不是sudo执行时的PATH。

验证真实情况

1
2
3
4
5
# 这个显示的是当前shell的PATH(不包含/usr/sbin)
sudo echo $PATH

# 这个显示的是sudo执行环境中的PATH(包含/usr/sbin)
sudo bash -c 'echo $PATH'

解决

对于root用户,修复方法不变:

1
2
3
4
5
6
7
8
# 永久修复root的PATH
echo 'export PATH=$PATH:/usr/sbin:/sbin' >> /root/.bashrc
source /root/.bashrc

# 验证
echo $PATH
which usermod
usermod --help