which 只搜尋 $PATH 中的可執行檔,不包含 Shell 內建指令 (如 cd)、別名、函數。本文詳細說明參數、實戰範例、常見誤區與替代工具 (type、command -v)。
which [選項] 指令名稱...
| 參數 | 說明 |
|---|---|
-a | 列出 $PATH 中所有同名可執行檔 (不只第一個) |
-p | 同 -a,但包含路徑 (部分實作) |
--skip-alias | 忽略 alias (GNU which 專有) |
--skip-functions | 忽略 Shell 函數 |
--read-alias | 從 stdin 讀取 alias 定義 (搭配 alias | which --read-alias) |
# 1. 尋找單一指令
$ which ls
/bin/ls
# 2. 列出所有同名指令 (發現被覆蓋的版本)
$ which -a python
/usr/bin/python
/usr/local/bin/python
# 3. 判斷指令來源類型 (which 做不到)
$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls
$ type cd
cd is a shell builtin
# 4. 腳本中安全取得路徑 (POSIX)
command -v grep # 標準、不受 alias 影響
$PATH 中,which 回傳空或錯誤。請用 type 或 command -v。$PATH 不同 (如 root vs 一般用戶),which 結果隨之變化。| 工具 | 標準 | 支援內建 | 支援 alias | 支援函數 | 輸出類型 |
|---|---|---|---|---|---|
| which | 非 POSIX | 否 | 否 (預設) | 否 | 路徑 |
| type | Bash 內建 | 是 | 是 | 是 | 描述+路徑 |
| command -v | POSIX | 是 | 否 (忽略) | 否 | 路徑 |
| command -V | POSIX | 是 | 是 | 是 | 描述 |
#!/bin/sh
# 可攜性最高:command -v
GREP=$(command -v grep) || { echo "grep not found"; exit 1; }
$GREP "pattern" file
善用 type 除錯指令來源,command -v 撰寫可攜腳本,which -a 排查版本衝突。
Linux 硬碟直接啟動 ISO 鏡像檔:GRUB2 循環掛載開機完整教學
HTTP 斷點續傳核心原理:Range 標頭與 206 Partial Content 回應
Linux 進程排程算法深度解析:FCFS、RR、多級回饋佇列、實時排程與 CFS 完全公平排程器
Ubuntu 軟體中心完整使用指南:搜尋、安裝、移除應用程式
CentOS 6.4 64位安裝配置 ntopng 網路流量即時監控完整實戰
Ubuntu 12.04 启动报错 "Ubuntu is running in low-graphics mode" 修复指南