crontab을 통해 실행되는 bash 스크립트에서 $(pwd)를 사용하는 방법은 무엇입니까?

crontab을 통해 실행되는 bash 스크립트에서 $(pwd)를 사용하는 방법은 무엇입니까?

Run_at_startup.sh다음 줄을 포함하는 스크립트가 있습니다 .

/bin/bash "$(pwd)/Testing_3.sh"

수동으로 실행하면 잘 Run_at_startup.sh나오네요 Testing_3.sh. 그러나 을 Run_at_startup.sh실행 crontab하면 Testing_3.sh실행되지 않습니다. 분명히 그게 문제입니다 $(pwd). 그럼 를 $(pwd)통해 실행되는 스크립트에서는 사용할 수 없나요 crontab? 그렇다면 대신 무엇을 사용할 수 있습니까 $(pwd)?

답변1

이를 호출한 프로세스의 현재 작업 디렉터리에 있는 스크립트를 실행하려면 ./that-script.

"$(pwd)/that-script"POSIX 같은 셸( cron명령줄을 구문 분석하려면 POSIX 같은 셸을 호출해야 함) 에서는 추가 프로세스를 실행해야 하고 스트리핑 "$PWD/that-script"때문에 더 나쁩니다.$(...)모두$PWD후행 개행. 따라서 현재 작업 디렉터리에 대한 저장된 경로가 개행으로 끝나면 작동하지 않습니다.

./that-script"$PWD/that-script"(이하로 확장 예정) 의 차이점 /path/to/working/directory/that-script은 전자는 상대 경로이고 후자는 절대 경로라는 점입니다. 두 경우 모두 that-script명령줄을 호출한 셸 프로세스의 현재 작업 디렉터리에 없으면 실패합니다.cron

기본적으로 작업은 crontab일반적으로 홈 디렉터리에서 시작됩니다.

해당 디렉토리에 없으면 that-script를 사용합니다 /actual/path/to/that-script. 스크립트가 현재 작업 디렉토리에서 실행되는지 여부도 중요하므로 /actual/path/to다음과 같이 할 수 있습니다.

cd /actual/path/to && ./that-script

또는:

cd /actual/path/to && "$PWD/that-script"

실행하려는 경우 that-scriptanother-script스크립트가 모두 동일한 디렉터리에 있습니다. 일반적으로 $0in 값에서 디렉터리를 파생 할 수 있습니다 other-script.

예를 들어 스크립트 other-script인 경우 zsh:

bash -- $0:h/that-script

그렇지 않고 $0줄 바꿈으로 끝나지 않는다고 가정하면 다음과 같습니다.

bash -- "$(dirname -- "$0")/that-script"

디렉터리 이름은 $0상대 경로일 수 있습니다. 절대 경로로 만들려면 zsh에서 다음을 수행할 수 있습니다.

bash -- $0:P:h/that-script

기타 쉘:

dir=$(CDPATH= cd -P -- "$(dirname -- "$0")" && pwd -P) || exit
bash -- "$dir/that-script"

답변2

pwd현재 디렉터리로 돌아갑니다. 이 작업을 수행할 때마다 cd somedir결과가 pwd변경됩니다.

그러면 /bin/bash "$(pwd)/Testing_3.sh"시작 시 제대로 작동합니다. 하다

echo "$(pwd)/Testing_3.sh"

결과는 crontab에서 사용해야 하는 문자열입니다.

답변3

Kusalananda가 게시한 링크를 참조한 후 다음과 같은 해결책을 찾았습니다.

/bin/bash "$(dirname "$0")/Testing_3.sh"

$(디렉터리 이름 "$0")crontab을 통해 실행되는 bash 스크립트에서 잘 작동합니다.

관련 정보