Bash腳本獲取自身完整路徑的可靠方式我有一個Bash腳本需要知道它的完整路徑。我試圖找到一種廣泛兼容的方式來做到這一點,而不會結束相對或時髦的路徑。我只需要支持Bash,而不是sh,csh等。到目前為止我發現了什么:從地址中獲取Bash腳本的源目錄的接受答案是獲取腳本的路徑dirname $0,這很好,但可能會返回相對路徑(如.),如果您想更改目錄中的目錄,這是一個問題腳本并使路徑仍指向腳本的目錄。不過,dirname將成為這個難題的一部分。對OS X的Bash腳本絕對路徑 的接受答案(特定于OS X,但答案無論如何)都會給出一個函數,該函數將測試是否$0看起來相對,如果是,則會預先掛起$PWD。但是結果仍然可以包含相對位(雖然總體來說它是絕對的) - 例如,如果腳本t在目錄中/usr/bin并且你進入/usr并且你輸入bin/../bin/t它來運行它(是的,那是復雜的),你最終會得到/usr/bin/../binas腳本的目錄路徑。哪個有效,但......此頁面上的readlink解決方案如下所示:# Absolute path to this script. /home/user/bin/foo.shSCRIPT=$(readlink -f $0)# Absolute path this script is in. /home/user/binSCRIPTPATH=`dirname $SCRIPT`但是readlink不是POSIX,顯然解決方案依賴于GNU readlink,其中BSD由于某種原因無法工作(我無法訪問類似BSD的系統進行檢查)。所以,各種方式,但他們都有他們的警告。什么是更好的方式?“更好”的意思是:給了我絕對的道路。即使以復雜的方式調用,也可以獲得時髦的位(參見上面#2的評論)。(例如,至少要對路徑進行適度規范化。)僅依賴于Bash-isms或幾乎肯定會出現在最流行的* nix系統(GNU / Linux,BSD和類似BSD的系統,如OS X等)上的東西。如果可能,避免調用外部程序(例如,更喜歡Bash內置程序)。(更新,感謝抬起頭,至極)它沒有解決符號鏈接(其實,我倒是那種喜歡它,離開他們獨自一人,但是這不是必須的)。
3 回答

墨色風雨
TA貢獻1853條經驗 獲得超6個贊
我很驚訝realpath這里沒有提到這個命令。我的理解是它廣泛便攜/移植。
您的初始解決方案變為
SCRIPT=`realpath $0`
SCRIPTPATH=`dirname $SCRIPT`
并根據您的偏好保留未解析的符號鏈接:
SCRIPT=`realpath -s $0`
SCRIPTPATH=`dirname $SCRIPT`

達令說
TA貢獻1821條經驗 獲得超6個贊
我發現在Bash中獲得完整規范路徑的最簡單方法是使用cd
和pwd
:
ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")"
使用${BASH_SOURCE[0]}
,而不是$0
不管腳本是否被調用為產生相同的行為<name>
或source <name>
。
添加回答
舉報
0/150
提交
取消