在 cron 脚本中使用“/usr/bin/cd”失败,而“cd”有效

在 cron 脚本中使用“/usr/bin/cd”失败,而“cd”有效

我有一个简单的 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

pwdvs./usr/bin/pwd则不存在这样的问题,因为外部pwd继承了 shell 的工作目录,因此它可以像内置的一样打印它(只要路径不包含符号链接)。

相关内容