繁体   English   中英

如何在带有花括号的 bash 脚本中尝试捕获?

[英]How to do a try catch in bash scripts with curly braces?

在 bash 脚本中模仿 try-catch 的推荐模式是使用花括号。 但是,这并没有按预期工作。 以下脚本输出AB 1 为什么会出现这种情况以及必须如何修改脚本以输出预期的AC 1

#!/usr/bin/env bash
set -e

{
  echo "A"
  false
  echo "B"
} || echo "C"

{
  echo "1"
  false
  echo "2"
}

'set -e' 有很多问题——它在许多错误情况下都不能很好地工作。 这在很多帖子中都有介绍,只需搜索“errexit bash”即可。 例如: Bash subshel​​l errexit 语义

此时,没有干净的解决方案。 不过,也有好消息。 我正在研究一项提议的更改,以使上述内容生效。 请参阅 bash-bug 存档中的讨论: https ://lists.gnu.org/archive/html/bug-bash/2022-07/index.html 和建议: https ://lists.gnu.org/archive/html/ 错误bash/2022-07/msg00006.html

可以找到“errfail”的最终提案: https ://lists.gnu.org/archive/html/bug-bash/2022-07/msg00055.html

我希望本周能将解决方案提交给 bash 开发团队审核。 希望它将被接受到下一个 bash 版本中。

它将支持新的 'errfail' 选项

set -o errfail
{ echo BEFORE ; false ; echo AFTER ; } || echo "CATCH"

并将输出: BEFORE CATCH

如果您正在寻找更花哨的解决方案,请考虑:

alias try=''
alias catch='||'
try {
    echo BEFORE
    false
    echo AFTER
} catch { echo CATCH ; }

使用 2 个单独的 bash 调用的解决方法:

bash -c 'set -e; echo "A"; false; echo "B"' || echo 'C'

bash -c 'set -e; echo "1"; false; echo "2"'

或有意图:

bash -c '
   set -e
   echo "A"
   false
   echo "B"
' || echo 'C'

bash -c '
   set -e
   echo "1"
   false
   echo "2"
'

输出:

A
C
1

代码演示

只需使用&&并删除这个危险的难以预测的set -e

#!/bin/sh

{
  echo "A" &&
  false &&
  echo "B"
} || echo "C"

{
  echo "1" &&
  false &&
  echo "2"
}

试运行它

在代码中绝对明确永远不会有任何问题。 不要指望实现来处理甚至部分逻辑。

这就是set -e正在做的事情。 为你处理一些逻辑,它的作用与你大多数时候所期望的完全不同。

因此,始终要明确并明确处理错误情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM