[英]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 subshell 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.