java的bash腳本類路徑問題
內容
/opt/scripts/jvm/jvm.script.sh
#!/bin/bash JAVA_HOME='/java' PATH="$PATH:/$JAVA_HOME/bin" java -cp ./classes:./lib com.mystuff.bar.foo.myclass &
內容
/etc/init.d/init.script.sh
home='/opt/scripts/jvm' program=jvm.script.sh su scriptuser -c "$home/$program"
/opt/scripts/jvm
符號連結到/data/shellscripts
(意味著/data/shellscripts
作為真實目錄存在)。執行初始化腳本失敗,
cannot find class com.mystuff.bar.foo.myclass
但如果我 su 到同一個使用者並執行它,它可以工作,為什麼?當我執行時,
su scriptuser -c 'declare -p JAVA_HOME'
我得到JAVA_HOME not found
了,但是如果我先 su 到使用者(使用su scriptuser
)並執行它,我得到JAVA_HOME="/java"
這聽起來可能很瘋狂,但如果我在 init 腳本中的 home 變數中添加一個斜杠,它似乎可以解決問題。
所以:
home='/opt/scripts/jvm'
變成
home='/opt/scripts/jvm/'
似乎環境正在弄亂符號連結的處理方式。
對於路徑和起訴,這是一個令人困惑的問題。當您執行此命令時:
$java -cp ./classes:./lib com.mystuff.bar.foo.myclass
並得到“找不到類”,這意味著 java 無法在 ./classes 或 ./lib 中找到該類。如果你要麼
a) 使用絕對路徑,或 b) 在執行命令之前 cd 到正確的位置 (su scriptuser -c “cd $ home ; ./ $ 程序”)
它將更可靠地工作。
至於為什麼在 home 中添加“/”會有所不同,這看起來確實很奇怪。您可以斷開 strace/truss 並查看該命令正在進行的系統呼叫。這個答案引用了 posix 規範:
linux如何處理多個路徑分隔符(/home////username///file)
並說“對於作用於目錄條目的程序,如果 foo 是指向目錄的符號連結,那麼傳遞 foo/ 是一種使程序作用於目錄而不是符號連結的方法。”