萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 查看當前 Shell 的 7 種方法:從 $SHELL 到 /proc 進程檢視

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

方法一:echo $SHELL(最常用,但非即時)

$ echo $SHELL
/bin/bash
  • 優點:簡單、所有 Shell 支援。
  • 缺點:顯示的是登入 Shell(/etc/passwd 記錄),而非當前執行 Shell。若在 bash 中執行 zsh,$SHELL 仍回傳 /bin/bash。

方法二:echo $0(顯示當前 Shell 程式名)

$ echo $0
-bash
$ zsh
$ echo $0
zsh
  • 優點:反映當前進程的程式名稱(argv[0])。
  • 缺點:非所有 Shell 都正確設定 $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
  • 顯示系統帳號資料庫中記錄的登入 Shell,不受當前會話影響。
  • 適用於審計用戶預設 Shell 設定。

方法五:ps -p $$(檢視當前進程資訊)

$ ps -p $$
  PID TTY          TIME CMD
 3052 pts/0    00:00:00 bash
  • $$ 為當前 Shell 進程 PID。
  • 直接顯示當前 Shell 進程的命令名稱,最直觀準確。

方法六: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
  • 可見父進程(1860 為 sshd/登入程序)、當前 Shell(-bash 表登入 Shell)、子進程。
  • 濾除干擾:ps -ef | grep `echo $$` | grep -v grep | grep -v ps

方法七:輸入不存在指令觀察報錯提示

$ asdf
bash: asdf: command not found
  • 錯誤訊息前綴即為當前 Shell 名稱(bash:、zsh:、fish:)。
  • 最「土」但極其有效的側寫法,無需記憶任何指令。

一鍷獲取當前 Shell 進程名(推薦腳本用)

ps -p $$ -o comm=
# 輸出:bash / zsh / fish / sh

或更完整:

ps -ef | awk -v pid=$$ '$2==pid {print $8}'

系統支援的 Shell 列表

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。理解這層差異,能避免許多環境變量傳遞與腳本相容性問題。

copyright © 萬盛學電腦網 all rights reserved