Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux 查看當前 Shell 的 7 種方法:$SHELL、$0、ps、/etc/passwd、echo $$ 等

編輯:關於 Linux

「我現在用的是 bash 還是 zsh?」「腳本裡怎麼判斷當前 Shell?」本文總結 7 種查看當前 Shell 的方法,對比它們的準確度、適用場景與局限性,並給出「一條指令搞定」的最佳實踐。

Shell 查看示意圖

前置知識:登入 Shell vs 互動 Shell vs 非互動 Shell

  • 登入 Shell:讀取 /etc/profile、~/.bash_profile 等
  • 互動 Shell:有提示符、可輸入指令
  • 非互動 Shell:執行腳本、管線、ssh cmd
  • 不同啟動方式讀取的設定檔不同,導致 $SHELL 可能不反映「當前實際運行」的 Shell

7 種查看方法對比

#方法指令輸出範例準確度說明
1環境變數 $SHELLecho $SHELL/bin/bash⭐⭐登入 Shell,不隨切換變化 (如 exec zsh 後仍顯示 bash)
2特殊參數 $0echo $0-bash 或 /bin/zsh⭐⭐⭐當前 Shell 進程名,但非所有 Shell 支援 (如 dash 某版本)
3環境變數 grepenv | grep SHELLSHELL=/bin/bash⭐⭐同 $SHELL,僅顯示登入 Shell
4/etc/passwd 查帳號grep ^$USER: /etc/passwduser:x:1000:1000::/home/user:/bin/bash⭐⭐用戶預設登入 Shell,非當前 Shell
5ps 查看當前進程ps -p $$ PID TTY TIME CMD\n1234 pts/0 00:00:00 bash⭐⭐⭐⭐直接看 PID=$$ (當前 Shell 進程) 的 CMD 欄,最準確
6echo $$ 再 grepps -ef | grep $$同上⭐⭐⭐需過濾 grep 自身,較繁瑣
7輸入錯誤指令看報錯asdfbash: asdf: command not found⭐僅能推斷互動 Shell,腳本中無效

最佳實踐:一條指令獲取當前 Shell 進程名

ps -p $$ -o comm=
# 輸出:bash / zsh / fish / dash ...
  • -p $$:指定當前 Shell 進程 ID
  • -o comm=:只輸出指令名 (無標頭)
  • 適用於所有 POSIX 相容 Shell、腳本、SSH 遠端執行

腳本中判斷 Shell 範例

#!/bin/sh
CURRENT_SHELL=$(ps -p $$ -o comm=)
case "$CURRENT_SHELL" in
  bash) echo "Running in Bash, 可用陣列、[[ ]]";;
  zsh)  echo "Running in Zsh, 可用擴展通配符";;
  dash) echo "Running in Dash, 嚴格 POSIX";;
  *)    echo "Running in $CURRENT_SHELL";;
esac

查看系統可用 Shell 列表

cat /etc/shells
# /bin/sh
# /bin/bash
# /bin/zsh
# /usr/bin/fish
# /sbin/nologin
  • chsh -s /bin/zsh:永久更改登入 Shell
  • exec zsh:當前會話臨時切換 (不影響 $SHELL)

總結建議

  • 互動終端快速確認:echo $0 最快
  • 腳本/嚴謹場景:ps -p $$ -o comm= 最準確
  • 查看用戶預設登入 Shell:grep ^$USER: /etc/passwd 或 getent passwd $USER
  • 切換 Shell 後:$SHELL、/etc/passwd 不會變,僅 $0、ps 反映新 Shell

掌握這 7 種方法的差異,下次遇到「為什麼腳本行為不符預期?」時,先查 ps -p $$ -o comm= 確認執行環境,即可快速定位 Shebang 或語法相容性問題。

Copyright © Windows教程網 All Rights Reserved