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/bin/パスワード到着パスワードそれは非常にうまく動作します。
誰かがなぜこれができるのかについての洞察力を持っているのだろうか。
ベストアンサー1
作業ディレクトリはプロセスの属性なので、外部バイナリは/usr/bin/cd
シェルの作業ディレクトリを変更できません。 (単に自分の作業ディレクトリを変更して終了します。)シェルの組み込みディレクトリが必要ですcd
。 。
はい、賢明に」と聞くこともできます。外部コマンドのポイントは何ですかcd
?」
pwd
対。には/usr/bin/pwd
そのような問題はありません。外部pwd
ディレクトリがシェルの作業ディレクトリを継承するため、組み込みディレクトリのように印刷できるため(パスにシンボリックリンクが含まれていない限り)。