which 與 whereis:找出指令位置 文章首圖

which 與 whereis:找出指令位置

前言

在 Linux 系統管理與開發的日常工作中,我們經常需要快速定位某個指令(Command)或程式的可執行檔究竟存放在哪裡。例如,當你在網路上看到一段教學提到使用 nginx 啟動服務,但執行時卻回報 command not found,這時你該怎麼辦?或者,你想知道 ls 指令的說明文件(Man page)放在哪裏?

這時,whichwhereis 就是兩位不可或缺的得力助手。雖然它們的功能有重疊,但底層邏輯與適用場景卻大不相同。這篇文章將深入解析這兩個指令的運作原理、選項差異,並透過實際範例幫助你掌握它們的精髓。

深入解析:which 指令

which 指令的核心功能是搜尋 $PATH 環境變數中定義的路徑,找出第一個符合條件的可執行檔。它非常適合用來確認「目前使用者」可以執行哪個版本的指令,特別是在多個軟體版本共存的情況下。

基本用法與輸出

讓我們來看看最基礎的用法。假設我們要確認 python3 的位置:

$ which python3
/usr/bin/python3

這裡輸出的 /usr/bin/python3 就是系統預設會執行的路徑。如果指令不在 $PATH 中,which 通常不會返回任何結果,且回傳值(exit status)會是非零值,這在腳本編寫時很有用。

實用選項:-a--skip-alias

which 有一個強大的選項 -a(all),它可以列出所有符合條件的可執行檔路徑,而不僅僅是第一個。這對於除錯非常有用,因為有時你以為自己在用 A 版本的指令,實際上卻因為路徑優先級的問題執行了 B 版本。

$ which -a python
/usr/bin/python
/usr/local/bin/python

此外,Linux 系統常用 alias(別名)來簡化指令。例如,你可能設定 ll='ls -l'。如果你想找的是真正的 ls 指令,而不是別名定義的內容,可以使用 --skip-alias 選項來忽略別名搜尋:

$ which --skip-alias ls
/bin/ls

深入解析:whereis 指令

which 不同,whereis 並非搜尋 $PATH,而是搜尋系統預建的資料庫(通常位於 /var/cache/man 或類似目錄,由 updatedbman-db 維護)。因此,whereis 的速度通常比 which 快得多,而且它能提供更豐富的資訊。

基本用法與輸出

whereis 會同時搜尋二進位檔(Binary)、原始碼(Source)、說明文件(Man page)等。

$ whereis grep
grep: /usr/bin/grep /usr/share/man/man1/grep.1.gz

從輸出結果可以看到,whereis 不僅找到了 /usr/bin/grep,還找到了對應的說明文件 /usr/share/man/man1/grep.1.gz。這是 which 無法做到的。

實用選項:-b-m

如果你只關心二進位檔,可以使用 -b 選項;如果只關心說明文件,則使用 -m 選項。這能讓輸出結果更加精簡,方便在腳本中處理。

# 僅顯示二進位檔位置
$ whereis -b grep
grep: /usr/bin/grep

# 僅顯示說明文件位置
$ whereis -m grep
grep: /usr/share/man/man1/grep.1.gz

常見問題與注意事項

1. 為什麼 which 找不到指令,但 whereis 找得到?

這通常發生在以下兩種情況:

  • 指令不在 $PATHwhich 嚴格依賴 $PATH 環境變數。如果該指令安裝在非標準路徑(如 /opt/custom/bin),且該路徑未加入 $PATHwhich 就會失效。
  • 資料庫未更新whereis 依賴系統資料庫。如果你剛剛安裝了一個新套件,但尚未執行 sudo updatedb(或 sudo mandb),whereis 可能還找不到新檔案。建議在安裝新軟體後,手動更新資料庫。

2. 該優先使用哪一個?

  • 日常除錯與版本確認:優先使用 which。因為它反映的是「當前環境」下實際會執行的路徑,對於排查 alias、shell function 或路徑衝突問題至關重要。
  • 尋找相關檔案與文件:優先使用 whereis。當你需要快速找到指令對應的 man page 或原始碼位置時,whereis 的效率與資訊量更勝一籌。

小結

whichwhereis 雖然是老將,但在 Linux 系統管理中依然佔有重要地位。which 關注的是「可執行路徑」,幫助你確認環境配置;whereis 關注的是「檔案位置」,幫助你快速定位相關資源。

建議你在日常使用中,將 which 作為檢查環境變數與路徑衝突的第一線工具,而將 whereis 作為尋找軟體資源與說明文件的快速通道。掌握這兩者的差異,將能大幅提升你在 Linux 世界中的操作效率與 troubleshooting 能力。