소스가 cwd를 인식하지 못합니까?

소스가 cwd를 인식하지 못합니까?

다른 파일을 가져오는 파일을 가져오는 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

발생할 수 있는 문제:

  1. 아니요셰르본안에 script.sh. cron에게 실행을 지시하면 script.sh다음과 같이 실행됩니다 /bin/sh -c script.sh( SHELLcrontab이 내부적으로 that 이외의 다른 항목을 가리키지 않는 한 /bin/sh). shebang이 없으므로 다음이 적용됩니다.Shebang 없이 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?대답은 크론이 사용하는 쉘에 따라 다르며 이에 대해서는 확실하지 않습니다. sh스크립트의 인터프리터로 다른 것을 선택하게 될 수도 있습니다. 선택되더라도 sh다른 것에서 제공될 수 있습니다. (Ubuntu에서는 기본으로 설정되어 있지만 실제로 그런지는 알 수 없습니다.)dashbashdash당신의 경우에는).

    요점은 script.sh스크립트가 cron에서 실행될 때 인터프리터가 무엇인지 실제로 알 수 없다는 것입니다. 어떤 경우에는 스크립트가 cron에서 전혀 시작되지 않을 수도 있습니다.

    OTOH 대화형 셸에서 스크립트를 실행할 때 다른 인터프리터를 선택하면 작동할 수 있습니다.

  2. cd /script/dir어떤 이유로든 실패할 수 있습니다().

  3. source예 alias .이지만 모든 쉘에 있는 것은 아닙니다. 우리는 통역사를 모르기 때문에 그것이 그것을 이해하는지 알 수 없습니다 source.

  4. source인터프리터가 이를 as 로 이해하더라도 .인수는 여전히 funcs.sh포함되지 않습니다 /. 이 경우 POSIX 동작은 이제 다음 .과 같습니다 .funcs.sh$PATH

    • $PATH포함 하더라도 .(즉, 현재 작업 디렉터리) cron의 동일한 변수에는 포함되지 않을 수 있습니다.

    • 검색에 $PATH실패한 경우에만일부쉘은 현재 작업 디렉토리를 시도합니다.

문제를 해결하려면 다음을 수행하세요.

  1. 실행 중에 해석에 사용되는 쉘을 script.sh제어할 수 있도록 내부에 shebang을 사용하십시오 .script.sh

    (선택한 셸에 따라 수정 사항 (3)과 (4)가 필요할 수도 있고 필요하지 않을 수도 있습니다. 아무런 해를 끼치지 않으므로 의심스러운 경우에는 적용하십시오.)

  2. 실패하면 중단합니다 cd. 실패 후에도 스크립트가 cd계속되면 스크립트가 funcs.sh잘못된 디렉터리에서 소스를 가져오려고 시도하는 것일 수 있습니다.

  3. .대신 사용하세요 source. 전자는 이식 가능하지만 후자는 그렇지 않습니다.

  4. /(이 경우 대신)을 포함하는 ./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스크립트가 있는 곳이기 때문에 출력됩니다 .

관련 정보