知道當前 Shell 類型 (bash/zsh/ksh/sh/csh/tcsh/fish) 能幫助選擇正確語法、排查啟動文件加載順序、理解作業控制差異。
$ ig
ksh: ig: not found. # 提示符顯示 ksh
$ ig
bash: ig: command not found # 提示符顯示 bash
$ ig
zsh: command not found: ig # 提示符顯示 zsh
原理:Shell 解析器在報錯時會在錯誤信息前加上自身名稱。
echo $0 — 當前 Shell 進程名稱 (POSIX 標準)$ echo $0
-ksh # 登入 Shell (帶 - 前綴)
$ echo $0
bash # 非登入交互 Shell
$ echo $0
/bin/zsh # 顯示完整路徑 (視調用方式)
適用:sh、bash、ksh、zsh、dash 等 POSIX 兼容 Shell。**csh/tcsh/fish 不支援 $0 變量**。
echo $SHELL — 用戶默認登入 Shell (非實時)$ echo $SHELL
/bin/bash
$ chsh -s /bin/zsh
$ echo $SHELL
/bin/zsh # 修改後生效,但當前會話仍可能是 bash
關鍵區別:$SHELL 來自 /etc/passwd,**反映「下次登入將用什麼 Shell」,而非「當前正在用什麼 Shell」**。切換 Shell 後 (如 exec zsh) $SHELL 不會自動更新。
ps -p $$ — 進程表查看當前 Shell 進程 (最準確、通用)$ ps -p $$
PID TTY TIME CMD
12345 pts/0 00:00:00 bash
$ ps -p $$ -o comm=
bash
優勢:適用於所有 Shell (含 csh/tcsh/fish),直接查詢內核進程表,**不受 Shell 內建變量/別名干擾**,準確度最高。
readlink /proc/$$/exe (Linux 專用,極簡)$ readlink /proc/$$/exe
/bin/bash
| 方法 | 適用範圍 | 實時性 | 備註 |
|---|---|---|---|
| 錯誤命令前綴 | 所有交互 Shell | 實時 | 最快、無需記憶語法 |
echo $0 | POSIX Shell (sh/bash/ksh/zsh/dash) | 實時 | 標準、腳本中常用 |
echo $SHELL | 所有 | 非實時 (登入默認) | 易誤判當前 Shell |
ps -p $$ | 所有 (Unix/Linux 通用) | 實時 | 最準確、推薦腳本使用 |
readlink /proc/$$/exe | Linux 專用 | 實時 | 最簡潔、需 /proc 掛載 |
# 檢測當前解析器
current_shell=$(ps -p $$ -o comm=)
case "$current_shell" in
*bash*) echo "Running under Bash";;
*zsh*) echo "Running under Zsh";;
*ksh*) echo "Running under Ksh";;
*sh*) echo "Running under POSIX sh";;
*csh*) echo "Running under Csh/Tcsh";;
*fish*) echo "Running under Fish";;
*) echo "Unknown shell: $current_shell";;
esac
交互式快速看:打個錯命令;腳本中嚴謹判斷:ps -p $$ -o comm=;查看用戶默認 Shell:echo $SHELL。三種工具組合,覆蓋所有查詢場景。