確認當前使用的 Shell 類型是排查環境問題、編寫腳本移植的基礎。本文介紹 7 種查看 Shell 的方法,分析各自優缺點與適用場景,並提供一鍷指令組合,助你快速精準獲取資訊。

echo $SHELL(最常用,但非即時)$ echo $SHELL
/bin/bash
zsh,$SHELL 仍回傳 /bin/bash。echo $0(顯示當前 Shell 程式名)$ echo $0
-bash
$ zsh
$ echo $0
zsh
$0(如某些嵌入式 Shell),且若透過別名/函數調用可能不準。env | grep SHELL(環境變量檢視)$ env | grep SHELL
SHELL=/bin/bash
本質同方法一,顯示登入 Shell 環境變量。
grep ^$USER: /etc/passwd(查詢用戶資料庫)$ grep "^$USER:" /etc/passwd
user:x:1000:1000::/home/user:/bin/bash
# 第 7 欄為登入 Shell
ps -p $$(檢視當前進程資訊)$ ps -p $$
PID TTY TIME CMD
3052 pts/0 00:00:00 bash
$$ 為當前 Shell 進程 PID。ps -ef | grep $$(完整進程樹視角)$ echo $$
1862
$ ps -ef | grep 1862
root 1862 1860 0 01:50 pts/0 00:00:00 -bash
root 2029 1862 0 02:07 pts/0 00:00:00 ps -ef
root 2030 1862 0 02:07 pts/0 00:00:00 grep 1862
ps -ef | grep `echo $$` | grep -v grep | grep -v ps$ asdf
bash: asdf: command not found
bash:、zsh:、fish:)。ps -p $$ -o comm=
# 輸出:bash / zsh / fish / sh
或更完整:
ps -ef | awk -v pid=$$ '$2==pid {print $8}'
cat /etc/shells
# /bin/sh
# /bin/bash
# /bin/zsh
# /usr/bin/fish
# /sbin/nologin
chsh -s /bin/zsh 可永久變更登入 Shell(需在 /etc/shells 列表中)。
| 方法 | 反映內容 | 準確度 | 適用場景 |
|---|---|---|---|
echo $SHELL | 登入 Shell(環境變量) | 中 | 快速查看用戶預設 Shell |
echo $0 | 當前進程 argv[0] | 高 | 互動式確認當前 Shell |
ps -p $$ | 當前進程命令 | 最高 | 腳本/程式檢測當前 Shell |
grep /etc/passwd | 用戶資料庫登入 Shell | 高 | 帳號審計、預設 Shell 變更驗證 |
| 輸入錯誤指令 | Shell 錯誤提示前綴 | 高 | 無指令可用極端環境、教學演示 |
「登入 Shell」與「當前 Shell」是兩個概念:前者定義於 /etc/passwd 與 $SHELL,後者為實際執行的進程。腳本中請使用 ps -p $$ -o comm= 獲取當前 Shell;互動式操作用 echo $0 最直觀;需變更預設 Shell 請用 chsh 並確認 /etc/shells。理解這層差異,能避免許多環境變量傳遞與腳本相容性問題。