在git hooks中 - 我想在推送之前检查jshint错误和纱线完整性检查,所以我在预推中添加了下面的内容。 所以它是这样的 -
# Pre-push hooks
# Lint stuff before committing
grunt jshint eslint tslint
# Verifies that versions and hashed value of the package contents
in the project’s package.json matches that of yarn’s lock file.
yarn check --integrity
所以只有在最后一次检查失败的情况下它才会失败,而在其他情况下它会说明错误但仍会推送它
答案 0 :(得分:5)
这真是一个关于编写脚本的问题。
在sh / bash脚本中,一系列命令只运行一系列命令:
cmd1
cmd2
cmd3
任何一个命令“失败”都没关系(返回非零退出状态);脚本继续运行下一个。
脚本的最终退出状态是最后运行的命令的退出状态,除非您提供特定状态:
exit 0
(零意味着成功)。
如果您希望在任何命令失败时立即退出,可以设置-e
选项:
set -e
cmd1
cmd2
cmd3
这是相当粗糙的,并不总是正确的事情。请注意,如果cmd2
失败(退出非零),则cmd3
甚至不会启动,但shell会以cmd2
的失败退出状态退出。
要特别喜欢,您可以保存每个命令的退出状态:
cmd1; cmd1_status=$?
cmd2; cmd2_status=$?
cmd3; cmd3_status=$?
$?
变量会扩展到刚刚运行的命令的退出状态。
当然,现在您必须弄清楚如何处理这三种状态,因为您只能使用一个退出,但现在您可以先退出任何一个失败的状态,如果有的话:
test $cmd1_status != 0 && exit $cmd1_status
test $cmd2_status != 0 && exit $cmd2_status
exit $cmd3_status
现在,您的脚本无条件地运行所有三个命令,但返回第一个非零故障的状态。如果cmd1和cmd2都返回零状态,则脚本将以cmd3中的状态退出。