如何执行命令,如果失败,则执行另一个命令并返回1?

如何执行命令,如果失败,则执行另一个命令并返回1?

我在其他语言中习惯了这种风格:

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 表示“执行下一个命令”。

相关内容