2012-06-11 25 views
1

我一直在使用這種技術來獲取正在運行的shell腳本的絕對物理路徑,然後在某處閱讀(我不記得在哪裏)。查找正在執行的Unix shell腳本的絕對路徑的有效/健壯模式?

cd $(dirname "$0") && ABSPATH=$(pwd) && cd - > /dev/null 

這似乎像它應該很好地工作,無論是否腳本是從絕對或相對路徑調用,即script.sh./script.sh../script.sh../../../lib/script.sh/Users/../scripts/script.sh,從另一個腳本中,等

事實上,這種技術看起來像是一個絕對可靠的任何相對路徑模式。

我知道很多這樣做的技術往往不適用於一個系統或另一個系統,出於某種原因。那麼,這種技術有沒有兼容性問題?它是否應該和幾乎所有的Unix操作系統和shell一起工作,還是存在一些潛在的問題?

回答

0

一個潛在的問題是它不會遵循符號鏈接(也就是說,如果"$0"實際上是腳本的符號鏈接,您將獲得包含符號鏈接的目錄,而不是包含該腳本的實際目錄)。

另一個是你不一定信任"$0"。例如,如果您的腳本由exec函數中的一個加載,則爲argv[0]傳遞任意字符串很簡單。我使用"$BASH_SOURCE"來代替,儘管這顯然是特定於bash的。

你錯過了「s左右$(dirname "$0"),所以如果目錄名稱,如包含空格,它不會工作

我相信這能解決這些問題:

cd "$(dirname "$(readlink -e "$BASH_SOURCE")")" && ABSPATH=$(pwd) && cd - > /dev/null 
+0

的readlink上不存在有些系統和-e在OS X或某些其他BSD系統上不起作用,而且在某些系統上不是bash不可用? –

+0

@Jake Petroules是的,我猜你正在尋找可移植性問題,而不是用''「」怪癖「 $ 0「'和符號鏈接,並且我剛剛添加了更多內容:P – dave

+0

如果他們只想爲此設置一個環境變量那天,呃? –

相關問題