pwd(print working directory)是 Linux 顯示當前工作目錄絕對路徑的基本指令。雖然功能單一,但對於處理符號連結(-P vs -L)、驗證腳本執行路徑、除錯目錄變更等場景至關重要。本文完整說明語法、參數差異、實戰範例與特殊情境處理。

pwd [選項]
核心功能: 輸出當前工作目錄的完整絕對路徑(以 / 開頭)。
| 參數 | 長參數 | 行為 | 適用場景 |
|---|---|---|---|
| -P | --physical | 顯示實體路徑,解析符號連結 | 需要知道實際磁碟位置、除錯連結問題 |
| -L | --logical | 顯示邏輯路徑,保留符號連結名稱(Shell 內建預設) | 腳本中保持路徑一致性、使用者視角 |
Shell 內建 vs 外部指令: Bash 內建pwd預設行為為-L;外部指令/bin/pwd預設為-P。腳本中建議顯式指定參數避免差異。
pwd
# /home/user
cd /opt/soft
pwd
# /opt/soft
# 假設 /etc/init.d -> /etc/rc.d/init.d (符號連結)
cd /etc/init.d
pwd # /etc/init.d (邏輯路徑,-L 預設)
pwd -P # /etc/rc.d/init.d (實體路徑)
/bin/pwd # /etc/rc.d/init.d (外部指令預設 -P)
/bin/pwd -L # /etc/init.d
cd /opt/soft
mkdir removed
cd removed
pwd # /opt/soft/removed
rm -rf ../removed # 刪除上層目錄
pwd # /opt/soft/removed (Shell 內建快取路徑)
/bin/pwd # 錯誤:couldn't find directory entry in ".." with matching i-node
cd
pwd # /home/user (切換後恢復正常)
深度解析: Shell 內建pwd維護邏輯路徑快取($PWD變數),目錄被刪除後仍回傳快取值;/bin/pwd透過系統呼叫getcwd()解析實際 inode,發現目錄不存在則報錯。
#!/bin/bash
# 取得腳本所在實體目錄(解析符號連結)
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
echo "腳本實體路徑:$SCRIPT_DIR"
#!/bin/bash
EXPECTED="/var/www/html"
CURRENT=$(pwd -P)
if [[ "$CURRENT" != "$EXPECTED" ]]; then
echo "錯誤:請在 $EXPECTED 執行此腳本,目前在 $CURRENT" >&2
exit 1
fi
# 解析相對/符號連結路徑為實體絕對路徑
readlink -f ../data/file.txt
# 等同於
(cd "$(dirname ../data/file.txt)" && pwd -P)/$(basename ../data/file.txt)
| 現象 | 原因 | 解決 |
|---|---|---|
| pwd 輸出與實際不符 | 經由符號連結進入目錄,使用邏輯路徑 | 加上 -P 參數或使用 /bin/pwd |
| 腳本中 $PWD 變數未更新 | 使用 cd 但非 Shell 內建(如搭配 sudo) | 腳本中改用 pwd -P 重新取得 |
| 掛載點路徑顯示異常 | bind mount 或 overlayfs 層級 | findmnt -T $(pwd -P) 查看掛載資訊 |
pwd(Shell 內建,快速、邏輯路徑)pwd -P 取得實體路徑,避免符號連結導致邏輯錯誤pwd -P 或 readlink -f 正規化後再比較pwd、pwd -P、/bin/pwd、ls -ld .、stat . 多源驗證理解 pwd 的邏輯/實體路徑機制與 Shell 內建與外部指令差異,能有效避免路徑解析導致的腳本錯誤與部署失敗,是 Linux 開發運維的基礎功力。