2011-04-25 70 views
4

這是我的情況:在bash2中,我如何找到源代碼的名稱?

我在源代碼控制中的名稱因路徑名稱組件而異(例如:scc/project/1.0/script和scc/project/1.1/script)的腳本有多個版本。在另一個目錄中,這些腳本之一有一個符號鏈接。符號鏈接名稱與腳本名稱無關,並且在某些情況下可能會定期更改。這個符號鏈接反過來是由bash使用'。'來源的。命令。

我需要知道的是:如何在帶有Bash 2和Perl 5.5的10年曆史系統上確定引用腳本的目錄?由於各種原因,系統必須使用,並且無法升級。

在bash 3或以上,我用這個:

dir=`perl -MCwd=realpath -MFile::Basename 'print dirname(realpath($ARGV[0]))' ${BASH_SOURCE[0]} $0` 

道歉Perl的一個班輪 - 這本來是一個純Perl項目,shell腳本膠水一個非常小的量。

我已經能夠解決這個事實,即我使用的古代Perl不會從Cwd中導出「realpath」,但不幸的是,Bash 2.03.01不提供BASH_SOURCE或類似的東西已經能夠找到。作爲一種解決方法,我在一個文本文件中提供路徑信息,當我切換分支時手動更改路徑信息,但我真的很想將這個數字用於我自己使用的分支。

更新: 我很抱歉 - 顯然問題不明確。在任何情況下,我都不知道符號鏈接的名稱是什麼 - 這就是我試圖在運行時找到的。該腳本偶爾通過符號鏈接直接執行,但大多數情況下該鏈接是「。」的參數。命令在另一個腳本中運行。

另外,當腳本通過「。」來源時,$ 0沒有適當地設置,這是我試圖解決的全部問題。我爲鈍的道歉,但沒有解決方案完全取決於$ 0被設置是正確的。在Perl單線程中,我同時使用BASH_SOURCE和$ 0(BASH_SOURCE僅在腳本通過「。」來源時設置,因此單線程僅在沒有源時使用$ 0)。

+0

會strace幫助您獲取有關invokeation的信息? – Lynch 2011-04-26 05:07:48

回答

0

嘗試使用$0而不是${BASH_SOURCE[0]}。 (沒有承諾;我沒有bash 2左右。)

+0

$ 0會工作,如果我在做「sh linkname」。不幸的是,使用「.linkname」,$ 0被設置爲源自它認爲是$ 0的shell(對於登錄shell而言是「-bash」,而當從另一個腳本內完成時是源腳本)。 – 2011-04-25 16:16:58

+0

我很害怕那個。後來的版本和其他一些shell爲''source'd腳本設置'$ 0',但'$ 0'的管理方式並沒有太大的一致性(這就是爲什麼'bash'增加'$ BASH_SOURCE')的原因。 – geekosaur 2011-04-25 16:18:55

0

$0有您正在執行的程序/腳本的名稱。

0

是否可以?像

stat -c %N $file 
0

bash的cdpwd內建有一個-P選項來解決符號鏈接,所以:

dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P) 

作品使用bash 2.03

0

我設法獲取有關porcess採購信息我使用此命令的腳本:

ps -ef | grep $$ 

這並不完美,但告訴你哪個是要調用腳本的過程。它可以用一些格式來確定確切的來源。

相關問題