스크립트 자체가 포함된 디렉토리에서 심볼릭 링크를 통해 쉘 스크립트를 실행하십시오.

스크립트 자체가 포함된 디렉토리에서 심볼릭 링크를 통해 쉘 스크립트를 실행하십시오.

내 소원은 디렉토리를 변경한 다음 실행하는 것이 아닙니다. 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")")"

realpathGNU 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

  1. 심볼릭 링크 제거
  2. 실행: PATH=$PATH:/opt/TreeForm/그런 다음export PATH

변경 사항을 영구적으로 적용하려면 두 번째 지점의 명령을 .bashrc 파일(사용자 홈 디렉터리에 있음)에 추가하세요. 전역적으로(모든 사용자에 대해) 원하는 경우/etc/bash.bashrc

관련 정보