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