2012-01-25 48 views
3

叫我有一個文件夾結構,看起來像這樣:

link.sh 
dist/MyApp-3.0.0/script.sh 
dist/MyApp-3.0.0/lib/*.jar 

link.sh是一個符號鏈接KornShell(KSH)腳本script.sh。在shell腳本,我要調用一個Java程序使用下面的命令:

java -cp lib/* 

當我嘗試從符號鏈接啓動應用程序,我得到ClassNotFound因爲相對路徑是由連桿基座目錄解析(這個是正常的)。

裏面的shell腳本,我怎麼能拿到劇本(<...>/dist/MyApp-3.0.0/)的完整路徑?這將讓我修改我的Java調用:

java -cp ${SCRIPT_DIR}/lib/* 
+0

您不能以100%的可靠性從shell代碼中獲取「正在運行的腳本的完整路徑」。然而,你可以接近。 – Sorpigal

回答

3

編輯:使用的readlink

可以使用的readlink,並把它歸結爲:

SCRIPT_DIR=$(dirname "$(readlink -f $0)") 

編輯:沒有的readlink

if test -h $0; then 
    symdir=$(dirname "$(ls -l $0 | sed -n 's/.*-> //p')") 
    if [[ -z $symdir ]]; then 
     symdir=. 
    fi 
    fullreldir=$(dirname $0)/$symdir 
fi 
script_dir=$(cd $fullreldir; /bin/pwd) 

我誤解了腳本的位置,並已假定腳本的目錄中被調用在目標應用程序的目錄結構,其中以下將工作:

SCRIPT_DIR=$(cd $(dirname $0); /bin/pwd) 
+0

不起作用:它返回鏈接目錄,而不是腳本目錄:/ – Stephane

+0

呵呵......你需要確保你使用'/ bin/pwd'(命令),而不僅僅是'pwd'(內置shell) -/bin/pwd應該返回已解決的路徑 – Petesh

+0

我已經明顯改變了答案,有兩種機制 - 一種使用'readlink',一種使用'ls'和'sed',這更適合系統像Solaris一樣,默認沒有readlink鏈接 – Petesh

0

你必須使用的readlink函數(man readlink)

my2c

+0

我想完全在ksh內獲得某些東西,沒有依賴關係。如果不可行,我將在該文件夾上創建一個鏈接,而不是將其放在腳本本身上:MyApp - > MyApp-3.0.0。謝謝 – Stephane

+0

@Stephane:好的。見Petesh答案,應該工作;) – neuro

相關問題