我在其他语言中习惯了这种风格:
do_something || (log_error; return 1) # do something, and if that fails, log the error and then return 1 no matter what, even if the logging fails.
但我似乎无法在 bash 中找到等效项。问题是括号的工作方式有点像具有自己作用域的函数,并且返回 1 不会产生预期的行为。
这是我目前所拥有的,但并不完美:
! do_something && log_error && return 1
问题在于!令人困惑,并且返回 1 取决于日志记录是否成功。
这个更好,但更冗长:
do_something || (log_error; return 1) || return 1
有什么想法吗?
答案1
使用大括号。
do_something || { log_error; return 1;}
答案2
上次运行的命令的退出状态保存在$?
变量中。因此,您可以执行以下操作:
do something
if [[ $? > 0 ]]; then
do log_error; exit 1;
fi
我喜欢这种可读性。但是,你的代码非常好,你只需要替换&&
为;
:
! do_something && log_error ; return 1
&&
表示“仅当前一个命令成功退出时才执行下一个命令”,而;
just 表示“执行下一个命令”。