쉘 스크립트에서 디렉토리 작업 디렉토리 변경

쉘 스크립트에서 디렉토리 작업 디렉토리 변경

디렉토리를 쉘 스크립트 디렉토리로 변경하고 이를 에코하는 간단한 쉘 스크립트를 작성하려고 합니다.

스크립트는 다음과 같습니다.

#!/bin/bash
# cd '/explicit/path/to/script'
cd $(dirname $0)
echo $(dirname $0)

스크립트 디렉토리에 명시적인 CD를 사용하더라도 출력은 항상 다음과 같습니다.

/bin

내가 무엇을 놓치고 있나요?

답변1

스크립트를 가져오는 대신 스크립트를 실행해야 합니다.

/path/to/script.sh

(아니요 .).

당신이 달릴 때

. /path/to/script.sh

$0현재 쉘이며 아마도 위치가 있을 것입니다 /bin(따라서 보이는 동작). 반드시 그런 것은 아니며 /bin/bash, 스크립트를 가져올 때 shebang은 아무런 효과가 없습니다.

루카스' 다른 점은 유효합니다. 따옴표를 사용하고 dirname없이 직접 실행 해야 합니다 echo.

답변2

이 변수는 $0사용자가 직접 실행하는 쉘 스크립트를 가리킵니다. 따라서 이 내용이 포함된 파일이 있는 경우

#!/bin/sh
echo "$0"

그것을 복사하고 두 복사본을 모두 실행 가능하게 /bin/my-script만들면 ~/somewhere/my-script-2다음 동작을 관찰할 수 있습니다(나는 /bin여러분의 동작이라고 가정합니다 $PATH).

$ my-script
/bin/my-script
$ ~/somewhere/my-script-2
/home/luc/somewhere/my-script-2
$ cd
$ somewhere/my-script-2
somewhere/my-script-2
$ ../../bin/my-script
../../bin/my-script
$ cd /bin
$ ./my-script
./my-script

등.

대화형 셸에서 $0실행 중인 셸을 가리키면 에 있을 가능성이 높습니다 /bin. 따라서 위의 셸 스크립트를 얻으면 항상 셸 해석기의 경로가 표시됩니다 /bin/bash. 이를 위해 두 스크립트가 실행 가능하지 않아도 됩니다.

$ . my-script
/bin/bash
$ . ~/somewhere/my-script-2
/bin/bash
$ cd
$ . somewhere/my-script-2
/bin/bash
$ . ../../bin/my-script
/bin/bash
$ cd /bin
$ . ./my-script
/bin/bash

그 이유는 소스 스크립트가 소스 스크립트와 동일한 프로세스에서 실행되고 $0변경되지 않았기 때문입니다( $@업데이트되었음에도 불구하고).

dirname "$0"이 인쇄 되면 /bin실행 중인 파일이 에 있거나 대화형 세션 또는 소스 스크립트에서 /bin실행 중이고 dirname사용 중인 인터프리터가 에 있음을 의미합니다 /bin.

기타 사항:

  • 당신은 그것을 할 필요가 없으며 같은 일을 할 것입니다 echo "$(dirname "$0")".dirname "$0"
  • 사용 pwdget현재의작업 목록.
  • 따옴표 $0와 명령 대체를 추가하세요. 그렇지 않으면 문제가 발생할 수 있습니다. cd $(echo a b c)문제를 확인하려면 비슷한 것을 시도해 보세요 .

관련 정보