下面的代码片段正在工作,这样bash脚本就会在失败时尽早退出。
./gradlew clean build release
if [ $? -eq 0 ]
then
echo "Successfully BUILT FAKE RELEASE"
else
echo "BUILDING FAKE RELEASE FAILED"
exit $?
fi我看到了失败日志语句,但是调用它的脚本继续进行,而不是退出,在这个脚本中,我有几乎相同的代码。
./runAllTesting.sh
if [ $? -eq 0 ]
then
echo "Successfully RAN ALL TESTING"
else
echo "TESTING SYSTEM Failed(don't release this)"
exit $?
fi我在这里做错什么了?这是在10.11.6 el capitan mac电脑上。
发布于 2016-12-22 23:27:05
我的脚本还在继续
是的,您应该在调用脚本中检查代码段的退出代码,然后进行相应的操作。
if ! ./posted_snippet.sh; then
exit
fi这样,顶层就会退出,但会丢失导致其退出的错误代码信息。这通常是不相关的,因为来自posted_snippet.sh的错误消息会说明哪个测试失败了,以及为什么失败。但是,如果必须将错误代码传递到上层,则可以使用简洁的形式。
./posted_snippet.sh || exit $?这比if ./posted_snippet.sh; then :; else exit $?; fi好得多。
关键是posted_snippet.sh应该使用正确的代码退出,并且在注释中已经指出它没有退出。最后一个$?捕获了echo的退出代码,它始终是0。以下是一个工作版本:
./runAllTesting.sh
test_result=$?
if [ $test_result -eq 0 ]; then
echo "Successfully RAN ALL TESTING"
else
echo "TESTING SYSTEM Failed(don't release this)"
exit $test_result
fi发布于 2016-12-22 23:43:08
$?是指执行的最后一个命令的退出状态。执行的最后一个命令是echo "TESTING SYSTEM Failed(don't release this)",并成功运行。在echo声明之后,您真正要做的是exit 0。解决方法是将$?保存在变量中。
./gradlew clean build release
readonly status=$?
if [[ $status -eq 0 ]];then
echo "Successfully BUILT FAKE RELEASE"
else
echo "BUILDING FAKE RELEASE FAILED"
exit $status
fi只有在脚本中的子进程中执行if条件语句时,上述解决方案才能起作用
https://stackoverflow.com/questions/41292809
复制相似问题