Shell 基本操作
查看终端默认的 Shell
echo $SHELL
/bin/bash
如果你在当前终端中启动了一个新的 Shell(比如从 Bash 切换到 Zsh),
这个命令显示的仍然是默认的登录 Shell,这个配置是存放在 /etc/passwd
里面的。
grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
在 macOS 中,默认的 Shell 信息通常是存储在用户账户设置中的,而不是 /etc/passwd
文件中。
从 macOS Catalina(10.15)开始,默认的 shell 已更改为 zsh
,之前的默认 Shell 是 bash
。
可以通过以下方法查看默认 shell。
dscl . -read /Users/$(whoami) UserShell
UserShell: /bin/zsh
查看正在运行的 Shell
$0
在 Shell 中运行返回 Shell 名称,在脚本中运行返回脚本名称/路径。
echo $0
-bash
前面的连字符 -
表示该 Shell 是用户的登录 Shell。
也可以通过 ps
命令查看进程状态。
ps -p $$
PID TTY TIME CMD
17216 pts/0 00:00:00 bash
如果你在当前终端中启动了一个新的 Shell(从 Bash 切换到 Sh),上面的两种方法会显示 sh
。
查看支持的 Shell
cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/usr/bin/sh
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen
修改默认的 Shell
修改成功后,/etc/passwd
中的内容会随之更新。
chsh
修改当前用户的登录 Shell 会要求输入用户密码。
chsh -s /bin/bash
使用 root 用户或 sudo 还可以修改其它用户的登录 Shell。
sudo chsh -s /bin/bash kuga
注意:如果我们输入一个不存在的 Shell。
chsh -s /bin/foo
chsh: /bin/foo is an invalid shell
它会检查输入的 Shell 是否在 /etc/shells
文件中,防止因为输入了不合法的 Shell 而导致登录失败。
usermod
使用这个命令需要 root 用户或拥有 sudo 权限的用户。
sudo usermod -s /bin/dash kuga
注意
usermod 不会检查 Shell 的合法性,不建议使用。
sudo usermod -s /bin/notexist kuga
上面的命令不会报错,但会导致 kuga 用户无法登录。
添加 sudo 权限
查看 sudo 组的成员列表。
getent group sudo
给用户添加 sudo 组的权限,需要 root 执行。
usermod -aG sudo username
不要直接编辑 passwd
如果不小心写错配置,很有可能会导致整个系统无法登录。
尽量不要使用 root
我就是不小心把 root 的登录 Shell 改成了 zsh, 但 Ubuntu 并没有安装 zsh,所以 root 就登不上去了。 还好我另外一个用户有 sudo 权限,还能正常登录, 我才成功把 root 的 Shell 改回来。 如果运气不好,没有 sudo 权限的用户,那就麻烦了。
sudo chsh -s /bin/bash root