![为什么在 .sh 中使用带有 && 的 git 会失败,但在命令行中却不会?](https://linux22.com/image/115895/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8%20.sh%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%B8%A6%E6%9C%89%20%26%26%20%E7%9A%84%20git%20%E4%BC%9A%E5%A4%B1%E8%B4%A5%EF%BC%8C%E4%BD%86%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%AD%E5%8D%B4%E4%B8%8D%E4%BC%9A%EF%BC%9F.png)
我有一个脚本(称为update_content.sh
),应该运行 3 个连续的git
命令,第一个版本如下所示:
#!/bin/sh
git fetch --all && git reset --hard && git merge
当我运行它时,我看到这个输出:
web@bane:~# ./update_content.sh
Fetching origin
error: unable to create file locales/fr.json (File exists)
error: unable to create file locales/it.json (File exists)
fatal: Could not reset index file to revision 'HEAD'.
然而当我把它改成这样时:
#!/bin/sh
git fetch --all
git reset --hard
git merge
运行它我看到这个:
web@bane:~# ./update_content.sh
Fetching origin
HEAD is now at 5859b2e Added Business tab
Already up-to-date.
换行方法得到了我想要的结果,但是它不具有“如果步骤失败则不继续”的质量&&
。是否有一些关于git
工作原理的内容使其与 不兼容,&&
或者我是否遗漏了一些内容&&
?
我做了更多的挖掘,发现&&
从命令行运行时的一个衬垫不会抛出错误,但实际上也没有重置本地工作副本,但是脚本内部的新行方法(并在时间)确实如此。
答案1
通常我会猜测前两个命令之一以非零代码退出。但这会阻止运行以下所有命令,并且未运行的命令无法生成错误消息......
但是,您可以使用以下命令检查命令的退出代码:
git fetch --all ; echo "exit code: ${?}"
git reset --hard ; echo "exit code: ${?}"
git merge ; echo "exit code: ${?}"
这将有助于运行脚本
bash -vx ./update_content.sh