查系统支持的Shell需查看/etc/shells文件,该文件是唯一权威的合法登录Shell白名单;运行cat /etc/shells或chsh -l可列出所有已注册路径,不在其中的Shell即使存在也无法通过chsh设置为默认。

查系统支持哪些 Shell,核心是看 /etc/shells 文件——这是 Linux 系统唯一权威的“合法登录 Shell 白名单”。
直接列出所有被系统认可的 Shell 路径
运行以下命令即可看到完整列表:
cat /etc/shells
输出类似:
/bin/sh<br>/bin/bash<br>/usr/bin/zsh<br>/bin/dash<br>/usr/bin/fish
每一行都是一个绝对路径,代表该 Shell 已被注册为可设为用户默认登录 Shell 的解释器。不在这个文件里的路径(比如自己编译安装到 /opt/myshell),chsh 会拒绝使用。
验证某个 Shell 是否被系统支持
想确认某款 Shell(比如 /usr/bin/zsh)是否可用,不用猜,直接 grep:
grep "^/usr/bin/zsh$" /etc/shells
有输出就说明已登记;没输出,即使程序存在、能手动执行,也不能通过 chsh 设为默认。
补充查看方式(非权威但实用)
有些系统提供快捷命令:
-
chsh -l:等价于cat /etc/shells,但部分精简环境(如 Alpine Linux)可能不支持 -
getent shells:通过系统数据库查询,结果与/etc/shells一致,适合统一管理多源认证的场景
注意:which zsh 或 command -v fish 只查程序是否存在、是否在 PATH 中,不能代替 /etc/shells 判断“是否被系统支持用于登录”。
为什么不能只看有没有安装?
安装了不等于被认可。例如:
- Debian/Ubuntu 默认不把
/usr/bin/zsh写入/etc/shells,即使你apt install zsh成功,chsh -s /usr/bin/zsh仍会失败 - 手动添加需 root 权限:
echo "/usr/bin/zsh" | sudo tee -a /etc/shells,且路径必须可执行、格式正确(无空格、无多余字符)
系统依赖这个文件做安全校验,PAM 模块和 login 程序都会读取它。


















