当前位置: 首页 > 知识库问答 >
问题:

如何在bash文件中尝试和捕获?

罗安宁
2023-03-14

我有shell文件(deploy.sh)执行以下命令:

  npm run build:prod

  docker-compose -f .docker/docker-compose.ecr.yml build my-app

  docker-compose -f .docker/docker-compose.ecr.yml push my-app

  aws ecs update-service --cluster ...

当其中一个命令发生错误时,我想停止bash的执行。

shell中的哪个命令可以做到这一点?

共有3个答案

仉成益
2023-03-14

我在谷歌上快速搜索了一下,似乎没有。最好是使用<代码>

SO-尝试在bash和Linuxhint中捕获

希望这有帮助

施驰
2023-03-14

可以使用 set -e 在出错时退出。更好的是,您可以设置 -e 并使用陷印函数。

  #!/bin/bash
  set -e
  trap 'catch $? $LINENO' EXIT
  catch() {
   echo "catching!"
   if [ "$1" != "0" ]; then
     # error handling goes here
     echo "Error $1 occurred on $2"
   fi
  }

  npm run build:prod

  docker-compose -f .docker/docker-compose.ecr.yml build my-app

  docker-compose -f .docker/docker-compose.ecr.yml push my-app

  aws ecs update-service --cluster ...

来源:https://medium.com/@dirk.avery/the-bash-trap-trap-ce6083f36700

何楷
2023-03-14

如果您想测试命令的成功或失败,您可以依赖其退出代码。知道每个命令在成功时会返回0或在失败时返回任何其他数字,您可以选择如何处理每个命令的错误。

npm run build:prod || exit 1
if docker-compose -f .docker/docker-compose.ecr.yml build my-app; then
  printf "success\n"
else
  printf "failure\n"
  exit 1
fi
docker-compose -f .docker/docker-compose.ecr.yml push my-app
if [ $? -gt 0 ]; then
  printf "Failure\n"
  exit 1
fi
err_report() {
    echo "Error on line $1"
}
trap 'err_report $LINENO' ERR

aws ecs update-service --cluster ...

若要全局“出错退出”,则<code>设置-e</code>即可。它不会给你很多信息,但它会让你完成工作。

 类似资料:
  • 问题内容: 不久前,我正在寻找Java中的可嵌入的分布式版本控制系统,我想我已经在JGit中找到了它,它是git的纯Java实现。但是,示例代码或教程的方式并不多。 如何使用JGit检索某个文件的HEAD版本(就像或应该做)? 我想这涉及一些rev-tree-walking,并且正在寻找代码示例。 问题答案: 不幸的是,Thilo的答案不适用于最新的JGit API。这是我找到的解决方案: 我希望

  • 问题内容: 是否可以在中使用Try-Catch ? 问题答案: 不,这是不可能的。 这仅来自Sql Server 2005 检查TRY … CATCH(Transact-SQL)并检查 其他版本

  • 我有一个返回< code>List的方法。现在我想知道如何正确放置< code>try/catch块。如果我将< code>return语句放在< code>try中,我会得到错误 并非所有代码路径都返回值 如果我放置在之后(就像我目前所做的那样),即使在之后,它也会返回。那么最好的方法应该是什么? 方法如下:

  • 问题内容: 我正在研究一个很长的Bash脚本。我想将CSV文件中的单元格读取到Bash变量中。我可以解析行和第一列,但不能解析其他任何列。到目前为止,这是我的代码: 它仅打印第一列。作为附加测试,我尝试了以下操作: $ y是空的。所以我尝试了: $ y是。为什么? 问题答案: 您需要使用而不是: 请注意,对于一般用途的CSV解析,您应该使用专门的工具,该工具可以处理带有内部逗号的带引号的字段,以及

  • 问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:

  • 这是我的bash脚本(“compile_java.sh”): 这就是我尝试调用bash脚本(我使用Ubuntu): 这就是“错误”信息: 谁能给我一个提示吗?