我有一个简单的 shell 脚本,我通过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到光盘和/usr/bin/密码到密码它工作得很好。
我只是好奇是否有人对这可能是为什么有任何见解?
答案1
工作目录是进程的一个属性,因此外部二进制文件无法/usr/bin/cd
更改 shell 的工作目录。 (它只会更改自己的工作目录,然后退出。)您需要 shell 的内置目录,仅使用cd
.
是的,人们可能会明智地问“外部命令有什么意义cd
?”
而pwd
vs./usr/bin/pwd
则不存在这样的问题,因为外部pwd
继承了 shell 的工作目录,因此它可以像内置的一样打印它(只要路径不包含符号链接)。