Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Shell 腳本取得自身絕對路徑與檔案名的最佳實踐:basename、dirname、BASH_SOURCE 完整解析

編輯:Linux 系統常見問題解答

取得檔案名 (去除路徑)

basename /root/aaa/bbb/dabu.txt
# 輸出: dabu.txt

取得腳本所在目錄 (三種寫法,健壯度遞增)

寫法一:$0 基礎版 (不支援 source/管道傳入)

DIR=$(cd "$(dirname "$0")"; pwd)

寫法二:BASH_SOURCE[0] 進階版 (支援 source、bash -c)

DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)

寫法三:完整解析符號連結版 (生產環境推薦)

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do
    DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)"
    SOURCE="$(readlink "$SOURCE")"
    [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
done
DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)"

關鍵點:

  • BASH_SOURCE[0] 為陣列,儲存腳本來源路徑,source 或管道執行時 $0 會變為 bash,前者不變。
  • cd -P 解析符號連結後的實體路徑。
  • 迴圈處理多層符號連結,readlink 取得目標,相對路徑需基於連結檔所在目錄解析。
  • 腳本中若先 cd 切換目錄,上述片段需置於腳本開頭或使用 $DIR 而非 pwd。
Copyright © Windows教程網 All Rights Reserved