다른 파일을 가져오는 파일을 가져오는 bash 스크립트가 있습니다.
script.sh:
cd /script/dir
source funcs.sh
funcs.sh:
...
source mode.sh
이제 /script/dir의 명령줄에서 스크립트를 실행하면 스크립트가 제대로 실행됩니다. 그런데 crontab에서 실행하면 funcs.sh 파일이 mode.sh를 찾을 수 없습니다. cd /script/dir
어떤 이유로 전달되지 않을 수도 있습니까 ? 스크립트에서 무엇이든 할 수 있나요? 아니면 cron이나 비슷한 것으로 CD를 작성해야 하나요?
답변1
발생할 수 있는 문제:
아니요셰르본안에
script.sh
. cron에게 실행을 지시하면script.sh
다음과 같이 실행됩니다/bin/sh -c script.sh
(SHELL
crontab이 내부적으로 that 이외의 다른 항목을 가리키지 않는 한/bin/sh
). shebang이 없으므로 다음이 적용됩니다.Shebang 없이 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?대답은 크론이 사용하는 쉘에 따라 다르며 이에 대해서는 확실하지 않습니다.sh
스크립트의 인터프리터로 다른 것을 선택하게 될 수도 있습니다. 선택되더라도sh
다른 것에서 제공될 수 있습니다. (Ubuntu에서는 기본으로 설정되어 있지만 실제로 그런지는 알 수 없습니다.)dash
bash
dash
당신의 경우에는).요점은
script.sh
스크립트가 cron에서 실행될 때 인터프리터가 무엇인지 실제로 알 수 없다는 것입니다. 어떤 경우에는 스크립트가 cron에서 전혀 시작되지 않을 수도 있습니다.OTOH 대화형 셸에서 스크립트를 실행할 때 다른 인터프리터를 선택하면 작동할 수 있습니다.
cd /script/dir
어떤 이유로든 실패할 수 있습니다(예).source
예 alias.
이지만 모든 쉘에 있는 것은 아닙니다. 우리는 통역사를 모르기 때문에 그것이 그것을 이해하는지 알 수 없습니다source
.source
인터프리터가 이를 as 로 이해하더라도.
인수는 여전히funcs.sh
포함되지 않습니다/
. 이 경우 POSIX 동작은 이제 다음.
과 같습니다 .funcs.sh
$PATH
$PATH
포함 하더라도.
(즉, 현재 작업 디렉터리) cron의 동일한 변수에는 포함되지 않을 수 있습니다.검색에
$PATH
실패한 경우에만일부쉘은 현재 작업 디렉토리를 시도합니다.
문제를 해결하려면 다음을 수행하세요.
실행 중에 해석에 사용되는 쉘을
script.sh
제어할 수 있도록 내부에 shebang을 사용하십시오 .script.sh
(선택한 셸에 따라 수정 사항 (3)과 (4)가 필요할 수도 있고 필요하지 않을 수도 있습니다. 아무런 해를 끼치지 않으므로 의심스러운 경우에는 적용하십시오.)
실패하면 중단합니다
cd
. 실패 후에도 스크립트가cd
계속되면 스크립트가funcs.sh
잘못된 디렉터리에서 소스를 가져오려고 시도하는 것일 수 있습니다..
대신 사용하세요source
. 전자는 이식 가능하지만 후자는 그렇지 않습니다./
(이 경우 대신)을 포함하는./funcs.sh
명시적 경로를 사용하면funcs.sh
검색할 필요가 없고$PATH
의미하는 파일이 무엇인지 명확해집니다.
수정된 내용은 script.sh
다음과 같습니다.
#!/bin/sh
cd /script/dir || exit 1
. ./funcs.sh
funcs.sh
파일은 쉘 해석으로 검색되므로 shebang 내부에 있을 필요는 없지만 script.sh
수정 사항 (3)과 (4)가 여전히 필요할 수 있습니다(선택한 쉘에 따라).
답변2
각 프로세스에는 $PWD
귀하의 것이 아닌 (작업 디렉토리) cron이 있습니다. 스크립트에서 ing $HOME
대신 이것을 사용할 수 있습니다.cd
#!/bin/bash
dir="$(dirname "$(readlink -f "$0")")"
echo $dir
$dir
스크립트의 위치 디렉터리입니다. 예를 들어
$ cd /
$ bash /home/junaga/script.sh
/home/junaga
스크립트가 있는 곳이기 때문에 출력됩니다 .