현재 스크립트와 동일한 디렉토리에 있는 스크립트를 실행하는 방법은 무엇입니까?

현재 스크립트와 동일한 디렉토리에 있는 스크립트를 실행하는 방법은 무엇입니까?

쉘 스크립트를 개발하기가 왜 그렇게 어려운가요? NodeJS에서는 간단히 다음을 수행할 수 있습니다.

require('./script')

그리고 항상 script현재 스크립트를 기준으로 해야 합니다. 하지만 쉘/배시에서 시도해 보면:

./script.sh

cwd( )와 pwd관련된 스크립트를 찾습니다 . 예상대로 점은 현재 스크립트가 위치한 디렉터리가 아닌 cwd( )를 의미하는 것 같습니다 .pwd

line 8: ./script.sh: No such file or directory

스크립트가 현재 실행되는 디렉토리를 기준으로 스크립트를 실행하는 방법은 무엇입니까?

나는 열심히 노력했다

/bin/bash script.sh

하지만 오류가 발생합니다.

/bin/bash: script.sh: No such file or directory

그런 다음 시도했습니다.

script.sh

이 오류가 발생합니다

line 8: script.sh: command not found

다음 해결 방법만 제대로 작동하지만 문제는 읽을 수 없다는 것입니다.

$("$(dirname "$(realpath "$0")")/script.sh")

답변1

스크립트 디렉토리를 얻는 또 다른 변형:

DIR="$(cd "$(dirname "$0")" && pwd)"

그런 다음 스크립트를 호출할 수 있습니다.

$DIR/script.sh

답변2

불행하게도 그렇게 가야 합니다.

(내가 선호하는) 또 다른 방법은 다음과 같이 스크립트 시작 부분의 현재 디렉터리로 cd하는 것입니다.

cd $(dirname $0)

답변3

다른 답변에서 알 수 있듯이 귀하의 솔루션이 정확합니다.

  • 다른 답변에서 알 수 있듯이 스크립트 디렉토리를 한 번 가져와 여러 번 사용할 수 있습니다. 이것이 더 깨끗하고 효율적일 수 있습니다.

  • 다른 답변에서 알 수 있듯이 아마도 필요하지 않을 것입니다  realpath. 왜 필요하다고 생각하십니까?

  • 귀하의 솔루션에 추가 금액이 있는 것 같습니다 $(.)

    "$(dirname "$(realpath "$0")")/script.sh"
    

    그거면 충분할텐데...

  • ...아무도 지적하지 않은 매우 미묘한 경우가 있다는 점을 제외하면 말이죠. 다른 답변을 균질화해 보겠습니다.

    DIR="$(dirname "$(realpath "$0")")"
    "$DIR"/script.sh
    

    "현재 스크립트"가 루트 디렉터리에 있고(예: ) 아무 효과도 없다고  /first_script가정하면 을 얻게 됩니다 .realpathDIR="/"

    "$DIR"/script.sh
    

    라인은 다음으로 확장됩니다.

    "/"/script.sh
    

    즉,

    //script.sh
    

    이는 일반적으로 동일 /script.sh하지만 Unix(POSIX)는 처리할 권리를 보유합니다.// 처음에특히 경로 이름. 무한히 안전해요

    DIR="$(dirname "$(realpath "$0")")"/
    "$DIR"/script.sh
    

    /정의 끝에 (추가, 명시적)이 있습니다 DIR. 그렇다면  $0은  으로 설정되고  로 확장됩니다  . 즉 /first_script,DIR//"$DIR"/script.sh///script.sh보장하다와 동일합니다 /script.sh$0예를 들어 보다 일반적인 항목 /foo/bin/first_script인 경우 DIR로 설정되고  로 확장  /foo/bin/됩니다 ."$DIR"/script.sh/foo/bin//script.sh보장하다./foo/bin/script.sh

답변4

답변 개선마이클 카일.

공백이 있는 경로를 처리하는 데 문제가 있었지만 다음을 사용하여 해결할 수 있었습니다.

cd "$(dirname "$0")"

관련 정보