Linux Shell獲取正在執行指令碼的絕對路徑

__HelloWorld__發表於2018-08-22

使用指令碼:

BASE_PATH=$(cd `dirname $0`;pwd)
echo "base_path is $BASE_PATH"

或者

DIR_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
echo "dir_path is $DIR_PATH"

我們在HOME目錄下,建立資料夾a,b,在a目錄下建立test.sh,在HOME目錄下執行test.sh指令碼,執行結果如下:
這裡寫圖片描述

注意,這種方法一般情況都可以正確獲取,但如果執行指令碼本身是符號連結,那這種方法就不大奏效,我們測試一下,我們在b目錄下建立一個符號連結ln_test.sh,指向a目錄下的test.sh
這裡寫圖片描述
執行b目錄下的ln_test.sh,得到結果如下:
這裡寫圖片描述

為了解決符號連結問題,我們可以用以下指令碼

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
  DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null && pwd )"

執行a目錄下的test.sh指令碼,得到結果如下:
這裡寫圖片描述
執行b目錄下的ln_test.sh,得到結果如下:
這裡寫圖片描述

https://stackoverflow.com/questions/59895/getting-the-source-directory-of-a-bash-script-from-within

相關文章