"cd"가 작동하는 동안 cron 스크립트에서 "/usr/bin/cd" 사용이 실패함

"cd"가 작동하는 동안 cron 스크립트에서 "/usr/bin/cd" 사용이 실패함

cron를 통해 예약된 작업을 수행하는 데 사용하는 간단한 셸 스크립트가 있으므로 git pull빠르고 지저분한 솔루션을 선택했습니다.

어쨌든 내 스크립트는 다음과 같은 작업을 수행합니다.

#!/usr/bin/bash

if /usr/bin/cd /opt/repos/other-teams-repo
then
    echo "success!"
else
    echo "fail :("
    exit 1
fi

/usr/bin/pwd

if /usr/bin/git pull
then
    echo "success on the pull"
else
    echo "fail on the pull"
    exit 1
fi

명령줄에서는 정상적으로 작동합니다. 하지만 cron을 통해 실행하면 다음과 같습니다.

57 11 * * 1 /opt/myuser/shell/otheruser-repo-git-pull.sh > /opt/log/repo-pull.git.cronlog 2>&1

내 cronlog에는 다음이 표시됩니다.

success!
/home/myuser
fatal: Not a git repository (or any parent up to mount point /home)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
fail on the pull

내가 바뀔 때/usr/bin/cd도착하다CD그리고/usr/빈/비밀번호도착하다비밀번호그것은 아주 잘 작동합니다.

누군가 이것이 왜 그럴 수 있는지에 대한 통찰력을 갖고 있는지 궁금합니다.

답변1

작업 디렉터리는 프로세스의 속성이므로 외부 바이너리는 /usr/bin/cd셸의 작업 디렉터리를 변경할 수 없습니다. (그냥 자체 작업 디렉토리를 변경한 다음 종료합니다.) 쉘의 내장 디렉토리가 필요합니다 cd. .

예, 현명하게 "라고 물어볼 수도 있습니다.외부 명령의 요점은 무엇입니까 cd?"

pwdvs. 에는 /usr/bin/pwd그런 문제가 없습니다 . 외부 pwd디렉토리가 쉘의 작업 디렉토리를 상속하므로 내장 디렉토리처럼 인쇄할 수 있기 때문입니다(경로에 심볼릭 링크가 포함되어 있지 않은 한).

관련 정보