내 소원은 디렉토리를 변경한 다음 실행하는 것이 아닙니다. jar 파일을 사용하고 있는데 이를 실행해야 합니다. 그래서 저는 이를 수행하기 위해 매우 기본적인 쉘 스크립트를 작성했습니다.
#!/bin/sh
java -jar TreeForm.jar
TreeForm
그런 다음 대신 에 저장합니다 TreeForm.sh
. 다음으로 다음과 같은 심볼릭 링크를 만들었습니다.
ln -s /opt/TreeForm/TreeForm /usr/bin/
chmod +x /opt/TreeForm/TreeForm
성공적으로 생성되었습니다. 그러나 실행하면 JAVA에서 다음 오류가 발생합니다.
실수: jarfile TreeForm.jar에 액세스할 수 없습니다.
따라서 쉘 스크립트는 자체 디렉토리를 실행하지 않거나 해당 디렉토리를 조사하지 않고 대신 현재 디렉토리에서 실행되는 것으로 보입니다. 현재 경로를 변경하거나 변수 경로를 추가하지 않고 스크립트 파일과 관련된 파일을 찾을 수 있는 방법 TreeForm.jar
이 있습니까 ? PATH
아니면 현재 경로 대신 스크립트 경로가 있는 변수가 있습니까?
답변1
쉘은 사용자가 지시하지 않는 한 다른 디렉토리로 변경되지 않습니다. 스크립트가 다른 디렉터리에서 명령을 실행하도록 하려면 cd
스크립트 내에서 호출하세요.
스크립트 경로는 다음과 같이 사용할 수 있습니다 "$0"
. 스크립트가 심볼릭 링크인 경우 이는 심볼릭 링크에 대한 경로입니다. 심볼릭 링크의 최종 목표를 얻으려면 다음을 호출하세요.realpath
(모든 최신 unice에서 사용 가능하지만 대부분은 사용 가능하지 않습니다. Linux(GNU 및 BusyBox), FreeBSD 및 Solaris 11에서는 사용 가능하지만 OSX에서는 사용 가능하지 않습니다.)
cd "$(dirname "$(realpath "$0")")"
realpath
GNU coreutils에 비교적 새로운 추가 항목입니다. 너무 오래된 경우 readlink -f
이전 버전을 사용할 수 있습니다. GNU가 아닌 시스템의 경우 존재 realpath
하지 않으면 존재할 수 있지만 readlink
일반적으로 첫 번째 수준 심볼릭 링크만 확인하며 대부분의 구현에는 전체 해결을 수행할 수 있는 옵션이 readlink
없습니다 .-f
답변2
인수에서 쉘 스크립트가 있는 디렉토리를 파생시킬 수 있습니다 $0
. 예를 들어 dirname
스크립트에서 다음을 수행할 수 있습니다.
cd $(dirname "$0")
jar 파일이 스크립트와 동일한 디렉토리에 있다고 가정합니다.
심볼릭 링크를 통해 스크립트를 참조하려는 경우(그리고 여전히 스크립트와 jar 파일이 동일한 디렉터리에 있다고 가정) 더 복잡한 스크립트를 통해 이 작업을 수행할 수 있습니다.
- 경로 이름을 찾습니다
$0
($PATH
기본 조회를 사용하는 경우 간단함). readlink
심볼릭 링크 읽기와 같은 프로그램을 사용하십시오. 이것은 POSIX는 아니지만 많은 Linux 시스템에 존재합니다.- 가 없으면
readlink
다른 해결 방법이 있습니다(출력 읽기 포함ls
). cd
링크를 어떻게 읽어도 상관없습니다.저것장소.
추가 자료:
답변3
- 심볼릭 링크 제거
- 실행:
PATH=$PATH:/opt/TreeForm/
그런 다음export PATH
변경 사항을 영구적으로 적용하려면 두 번째 지점의 명령을 .bashrc 파일(사용자 홈 디렉터리에 있음)에 추가하세요. 전역적으로(모든 사용자에 대해) 원하는 경우/etc/bash.bashrc