Bash 스크립트와 Java 간의 클래스 경로 문제

Bash 스크립트와 Java 간의 클래스 경로 문제

콘텐츠/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실제 디렉터리로 존재함을 의미)

init 스크립트 실행이 실패했지만 cannot find class com.mystuff.bar.foo.myclass 동일한 사용자에게 su하여 실행하면 작동합니다. 이유는 무엇입니까?

실행하면 을 su scriptuser -c 'declare -p JAVA_HOME'얻지 JAVA_HOME not found만 먼저 su scriptuser사용자로 su(사용)하고 실행하면 다음을 얻습니다.JAVA_HOME="/java"

이상하게 들릴 수도 있지만 init 스크립트의 home 변수에 후행 슬래시를 추가하면 효과가 있는 것 같습니다.

그래서:

home='/opt/scripts/jvm'

~이 되다

home='/opt/scripts/jvm/' 

환경적 요인이 심볼릭 링크 처리 방식을 혼란스럽게 만드는 것 같습니다.

답변1

이것은 경로와 su'ing에 대한 혼란스러운 질문입니다. 이 명령을 실행하면:

$java -cp ./classes:./lib com.mystuff.bar.foo.myclass

Java가 ./classes 또는 ./lib에서 클래스를 찾을 수 없음을 의미하는 "클래스를 찾을 수 없음"을 얻습니다. 만약 당신도

a) 절대 경로를 사용하거나 b) 명령을 실행하기 전에 올바른 위치로 cd합니다(su scriptuser -c "cd $home ; ./$program").

더 안정적으로 작동합니다.

home 뒤에 "/"를 추가하는 것이 왜 차이가 나는지에 대해서는 이상하게 보입니다. strace/truss를 분석하고 명령이 수행하는 시스템 호출을 확인할 수 있습니다. 이 답변은 POSIX 사양을 인용합니다.

Linux는 다중 경로 구분 기호(/home////username///file)를 어떻게 처리합니까?

그리고 "디렉토리 항목에서 작동하는 프로그램의 경우 foo가 디렉토리에 대한 심볼릭 링크인 경우 foo/를 전달하는 것은 프로그램이 심볼릭 링크 대신 디렉토리에서 작동하도록 만드는 방법입니다."라고 말합니다.

관련 정보