심볼릭 링크에서 bash 스크립트 실행. 상대 디렉토리가 작동하도록 디렉토리를 변경하는 방법

Asqiir

상황에 대해 :

mycommand내에서 명명 된 심볼릭 링크가 있습니다 $PATH. mycommand.sh다른 곳에서 호출되는 파일에 링크됩니다 . 그 파일은 다른 파일이 필요합니다 mycommand2.sh.

somedir
|-mycommand.sh
|-mycommand2.sh

직접 실행 ./mycommand.sh하면 다른 파일이 발견됩니다. 실행할 때 mycommand그렇지 않습니다. 이유 : mycommand.sh다른 파일 에서 ./mycommand2.sh.

mycommand모든 상대 디렉토리를 절대 디렉토리로 변경하지 않고 어떻게 작업 할 수 있습니까?

스테판 샤젤 라스

문제는 심볼릭 링크로 인한 것이 아닙니다.

mycommand.sh호출 ./mycommand2.sh경우 현재 작업 디렉토리는 다음과 같습니다 somedir. 현재 작업 디렉토리는 명령의 이름이 지정되거나 호출 된 방법과 관련이 없습니다. chdir()시스템 호출 또는 cd내장 명령으로 설정되는 프로세스의 속성입니다 .

그랬다면 :

cd /path/to/somedir
mycommand

mycommand일명 mycommand.sh여전히 ./mycommand2.sh현재 디렉토리에서 찾을 수 있습니다.

들어 mycommand.sh찾을 수 mycommand2.sh에 관계없이가 호출되고있는 작업 디렉토리의이 같은 수정 될 필요가있다 :

#! /bin/sh -
mydir=$(dirname -- "$0")
"${mydir%/}/mycommand2.sh"

또는 mycommand.sh작업 디렉토리가 다음 somedir같아야하는 경우 :

#! /bin/sh -
mydir=$(dirname -- "$0")
CDPATH= cd -P -- "$mydir" || exit

./mycommand2.sh

그리고는 다음과 같이 호출처럼 심볼릭 링크를 사용하여 문제를 야기 할 때의 mycommand, dirname -- "$0"의이 dirname을 반환 mycommand하지 그 중, 심볼릭 링크 mycommand.sh스크립트.

이 문제를 해결하려면 다음과 같이 수정 mycommand.sh합니다.

#! /bin/sh -
mydir=$(dirname -- "$(readlink -f -- "$0")")
"${mydir%/}/mycommand2.sh"

어디 readlink -f(안 표준 명령이지만 꽤 공통) 모든 심볼릭 링크를 해결하는 것입니다. 그것은 mycommand.sh다른 디렉토리에있는 스크립트에 대한 심볼릭 링크가 아니라고 가정 합니다.

해당 스크립트를 수정할 수 없거나 수정하지 않으려는 경우 다른 접근 방식은 다음을 수행하는 심볼릭 링크 대신 mycommand 스크립트 를 만드는 것입니다 .

#! /bin/sh -
cd /path/to/somedir &&
  exec ./mycommand.sh "$@"

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TOP 리스트

  1. 1

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  2. 2

    std :: regex의 일관성없는 동작

  3. 3

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  4. 4

    PrematureCloseException : 연결이 너무 일찍 닫혔습니다.

  5. 5

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  6. 6

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  7. 7

    Ionic 2 로더가 적시에 표시되지 않음

  8. 8

    Seaborn에서 축 제목 숨기기

  9. 9

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  10. 10

    복사 / 붙여 넣기 비활성화

  11. 11

    ArrayBufferLike의 typescript 정의의 깊은 의미

  12. 12

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  13. 13

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

  14. 14

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  15. 15

    PRNG 기간보다 순열이 더 많은 목록을 무작위로 섞는 방법은 무엇입니까?

  16. 16

    C # HttpWebRequest 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다.

  17. 17

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  18. 18

    잘못된 구성 개체입니다. Webpack이 Angular의 API 스키마와 일치하지 않는 구성 개체를 사용하여 초기화되었습니다.

  19. 19

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  20. 20

    R의 마침표와 숫자 사이에 문자열 삽입

  21. 21

    Assets의 BitmapFactory.decodeStream이 Android 7에서 null을 반환합니다.

뜨겁다태그

보관