为什么在 .sh 中使用带有 && 的 git 会失败,但在命令行中却不会?

为什么在 .sh 中使用带有 && 的 git 会失败,但在命令行中却不会?

我有一个脚本(称为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

相关内容