디렉토리를 쉘 스크립트 디렉토리로 변경하고 이를 에코하는 간단한 쉘 스크립트를 작성하려고 합니다.
스크립트는 다음과 같습니다.
#!/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"
- 사용
pwd
get현재의작업 목록. - 따옴표
$0
와 명령 대체를 추가하세요. 그렇지 않으면 문제가 발생할 수 있습니다.cd $(echo a b c)
문제를 확인하려면 비슷한 것을 시도해 보세요 .