2011-06-16 87 views
1

我試圖找到與Windows/DOS變量%cd%相同的unix。我正在尋找的是一個環境變量或解決方法,它可以讓我爲當前正在運行的文件的路徑設置一個變量。查找文件自己的路徑

例如,如果程序在/ home/chris/Desktop中,但工作目錄是/ home/chris,那麼獲取〜/ Desktop的命令是什麼,而不是pwd,它會給我/ home/chris 。

+1

從哲學上講,這很難,因爲文件沒有獨特的路徑(參見硬鏈接)。您可以希望獲得調用該文件的路徑所能達到的最佳效果。 – dmckee 2011-06-16 01:53:22

回答

1

在BASH中,您可以查看$PWD變量。這會顯示您的當前工作目錄。獲得$ PWD和程序所在位置之間的關係有點棘手。你可以看一下$ 0變量應該給你我跑到下面的腳本文件的名稱:

#! /bin/bash 
# 

echo "PWD = $PWD" 
echo "\$0 = $0" 

,並得到以下結果:

$ test.sh   
PWD = /Users/david 
$0 = /Users/david/bin/test.sh 

$0讓你的名字文件來自操作系統的根目錄。以dirname將給你的文件名。不知何故,如果你可以從$0中篩選出PWD,你可能會得到你想要的。我有以下幾點運氣:

curPath=$(dirname "${0#$PWD/}") 

沒有徹底測試它,從我所看到的,它似乎做你想做的。什麼不能做的是做這樣的事情:

$ test.sh 
PWD = /Users/david/someSubDir 
$0 = /Users/david/bin/test.sh 
The current path is /Users/david/bin/test.sh 

這本來是很好,如果能做到這一點:

The current path is ../bin/test.sh 

雖然前者是正確的。

readlink命令在非Linux系統上不起作用。

0

這樣的作品,但不是100%可靠:

${0%/*} 

的作品是它讀取$0(程序名)的方式,剝去一切從開始最後的斜線。這是不可靠的,因爲如果你的腳本是通過一個符號鏈接調用的,你將得到包含符號鏈接的目錄,而不是包含真實腳本的目錄。

此外,可能會傳入$0的「假」值,例如使用exec -a。所以即使你不使用符號鏈接,它仍然不是100%的解決方案。實際上,這樣的解決方案並不存在。

+0

$ 0特別是輸入中的第一個單詞,意思是它實際上只是用戶稱爲程序的內容,對嗎? – jpm 2011-06-16 01:51:59

+0

@jpm:非常多。這就是它不完全可靠的原因。 – 2011-06-16 01:55:11

0

使用克里斯建議的內容,可以使用which命令。根據man頁面,which報告了可執行文件的完整路徑,如果在shell提示符下輸入了其參數,則該可執行文件將被執行。由於我們知道$ 0是在shell提示符處輸入的,因此我們可以使用`which $ 0`來精確報告用於執行的路徑。不幸的是,這仍然遇到了符號鏈接問題,因爲它沒有提供避免符號鏈接的選項。

1

如何dirname $(readlink -f $0)

readlink -f $0返回規範化路徑行書。

dirname刪除了包括最後的\之後的所有內容。