首先要确认当前终端运行的是zsh还是bash,执行ps -p $$查看CMD列;$SHELL仅显示登录Shell设置,不反映当前进程;macOS Catalina及之后默认登录Shell为/bin/zsh。

你刚打开Mac终端,敲命令报错、别名不生效、Java环境变量失效,第一件事不是改配置,而是确认此刻终端里跑的到底是zsh还是bash——因为$SHELL显示的只是登录Shell设置,而真正执行命令的是当前进程。
查实时运行的Shell进程
这一步最准,直接看正在干活的内核:在终端里输入
ps -p $$
回车后看输出中CMD那一列,显示zsh就是zsh,显示bash就是bash。注意:这个结果不受$SHELL值干扰,也不受你手动输入bash或zsh启动子shell的影响——它只告诉你现在这一个窗口里到底哪个程序在解析你的命令。
看默认登录Shell设置
执行:
echo $SHELL
返回/bin/zsh说明系统把zsh设为你的登录Shell;返回/bin/bash则说明默认是bash。但【这个值不会随你在当前终端里执行bash或zsh而改变】,它只反映你每次新开终端时系统打算启动哪个Shell。
macOS Catalina(10.15)及之后版本新建账户默认都是/bin/zsh,老系统升级上来的可能保留/bin/bash。
快速交叉验证法
方法一:用$0查当前Shell名
echo $0
输出zsh或bash,和ps -p $$结果一致,但更简洁。
方法二:看配置文件是否被读取
临时删掉~/.zshrc第一行加个echo "zsh loaded",新开终端;如果看到那行输出,说明zsh在跑;同理测试~/.bash_profile。这招适合怀疑配置没生效时反向定位Shell类型。
方法三:直接试特有语法
在终端输入:
echo ${ZSH_VERSION:-no}
有版本号输出就是zsh;如果返回no,再试:
echo ${BASH_VERSION:-no}
有输出就是bash。zsh和bash各自独有的变量不会在对方环境下存在。











