应使用ps -p $$或echo $0确认当前运行的Shell名称,再调用对应Shell的--version参数(如bash --version)或内置变量(如$BASH_VERSION)查询版本;$SHELL仅显示默认Shell路径,不能反映当前会话实际Shell及其版本。

直接运行 echo $SHELL 只能告诉你默认 Shell 的路径,不是当前正在用的 Shell 版本——它甚至可能和你此刻的 Shell 完全不同。
怎么确认当前正在运行的 Shell 是哪个
别信 $SHELL,它只是登录时设定的默认值,换过 shell(比如执行 zsh 进入 zsh)后它也不变。真正反映当前进程的只有两个可靠方式:
-
ps -p $$:显示 PID 为当前 shell 进程 ID 的命令名,输出里的CMD列就是真实在跑的 shell 名(如bash、zsh、dash) -
echo $0:在绝大多数 shell(bash/zsh/sh/dash)里都有效,输出就是当前 shell 进程名,比如-bash或zsh
注意:$$ 是只读变量,不能被修改;$0 在脚本里会变成脚本名,所以务必在交互式终端里执行。
查版本必须调用对应 Shell 自己的机制
知道是哪个 shell 后,版本号得靠它自己报——没有统一接口。常见组合如下:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- bash:
bash --version或echo $BASH_VERSION(后者只在 bash 会话中有效) - zsh:
zsh --version或echo $ZSH_VERSION - fish:
fish --version - dash:
dash --version(部分精简系统不支持,可退而求其次用dash -c 'echo $0'辅助验证)
别用 ps -p $$ 看进程名就去猜版本——bash 这个名字不带任何版本信息;也别解析 /proc/$$/exe 软链接,容器或 chroot 下常失效。
为什么 chsh -s 改完不生效
chsh -s /usr/bin/zsh 只改 /etc/passwd 里用户记录的默认 Shell 字段,这个字段只在「新登录会话」(比如新开终端、ssh 重连、su - username)中起作用。已存在的终端进程不会重启、也不会继承新设置。
- 执行前先确认目标 shell 已注册:
grep /usr/bin/zsh /etc/shells,否则chsh会拒绝 -
exec zsh这类操作只是启动子进程替换当前 shell,$SHELL不变,登录属性也不变 - 普通用户只能改自己;root 可加用户名批量改:
chsh -s /bin/bash alice
最容易被忽略的是:版本查询和 Shell 切换是两件事——你可能正用着 zsh,但 $SHELL 还指着 /bin/bash;也可能已经 chsh 成功,却还在旧终端里查 bash --version。

















