쉘 스크립트를 개발하기가 왜 그렇게 어려운가요? 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
가정하면 을 얻게 됩니다 .realpath
DIR="/"
"$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