Bash

java的bash腳本類路徑問題

  • December 30, 2014

內容/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/ 是一種使程序作用於目錄而不是符號連結的方法。”

引用自:https://unix.stackexchange.com/questions/169755