首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从bash脚本读取返回代码到bash脚本?

从bash脚本读取返回代码到bash脚本?
EN

Stack Overflow用户
提问于 2016-12-22 22:55:21
回答 2查看 1.9K关注 0票数 1

下面的代码片段正在工作,这样bash脚本就会在失败时尽早退出。

代码语言:javascript
复制
./gradlew clean build release
if [ $? -eq 0 ]
then
  echo "Successfully BUILT FAKE RELEASE"
else
  echo "BUILDING FAKE RELEASE FAILED"
  exit $?
fi

我看到了失败日志语句,但是调用它的脚本继续进行,而不是退出,在这个脚本中,我有几乎相同的代码。

代码语言:javascript
复制
./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电脑上。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-22 23:27:05

我的脚本还在继续

是的,您应该在调用脚本中检查代码段的退出代码,然后进行相应的操作。

代码语言:javascript
复制
if ! ./posted_snippet.sh; then
  exit
fi

这样,顶层就会退出,但会丢失导致其退出的错误代码信息。这通常是不相关的,因为来自posted_snippet.sh的错误消息会说明哪个测试失败了,以及为什么失败。但是,如果必须将错误代码传递到上层,则可以使用简洁的形式。

代码语言:javascript
复制
./posted_snippet.sh || exit $?

这比if ./posted_snippet.sh; then :; else exit $?; fi好得多。

关键是posted_snippet.sh应该使用正确的代码退出,并且在注释中已经指出它没有退出。最后一个$?捕获了echo的退出代码,它始终是0。以下是一个工作版本:

代码语言:javascript
复制
./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
票数 3
EN

Stack Overflow用户

发布于 2016-12-22 23:43:08

$?是指执行的最后一个命令的退出状态。执行的最后一个命令是echo "TESTING SYSTEM Failed(don't release this)",并成功运行。在echo声明之后,您真正要做的是exit 0。解决方法是将$?保存在变量中。

代码语言:javascript
复制
./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条件语句时,上述解决方案才能起作用

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41292809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档