【问题标题】:abstract reacting to exit code对退出代码的抽象反应
【发布时间】:2021-09-02 14:49:25
【问题描述】:

我有一个脚本,我反复想对这样的命令的退出状态做出反应(这是一种简化形式):

function f() {
command1 $x $y && echo OK || return 1

#...

commandN $z $t && echo OK || return 1
}

有没有一种简单的方法可以将其抽象出来? 我在想一些类似的东西

function runme(){
  $@ && echo OK || return 1
}


function f(){
  runme command1 $x $y 
  #...

}

当然return 只适用于runme 函数本身,并且 不会从f 返回。 我也无法将'set -e'设置为work as I expected in all cases

有没有一种简单的方法可以用纯 bash 抽象出这个 if-else

【问题讨论】:

  • 当你想要的是if a; then b; else c; fi时不要使用a && b || c。它们不是 100% 相同的,极端情况(a 成功但 b 失败,所以 c 被运行)可能会搞砸你。
  • 另外,$@"$@" 也不一样。 始终使用引号,否则您的行为与(未引用的)$* 相同。
  • 另外,function f() { ... } 正在以与 either POSIX sh f() { ... } 和旧式 ksh 语法 function f { ... } >或旧版ksh。除非您有 非常 很好的理由不这样做,否则请不要使用 function 关键字,而只需使用 POSIX 声明语法。
  • @KamilCuk 我要返回1,即中断当前函数,而不是整个脚本
  • 顺便说一句,我强烈建议在决定考虑使用set -e 之前阅读BashFAQ #105(至少练习部分,如果你没有时间/耐心看寓言)。

标签: bash exit-code


【解决方案1】:

不要return 1——只是return;这样您就可以通过失败命令的特定退出状态,而不是将所有可能失败的退出代码折叠为始终精确为1

除此之外——如果你想编写清晰、明确、可移植的代码,你最终会让returns 明确。因此:

# return with no arguments uses "$?", which will be the exit status of "$@"
runAndAck() { if "$@"; then echo "OK"; else return; fi; }

f() {
  runAndAck command1 "$x" "$y" || return
  runAndAck command2 "$z" "$t" || return
}

...否则您最终会处理各个 shell(以及同一 shell 的版本——不同的 bash 版本不同)实现 set -e 之间的无数差异。

【讨论】:

    猜你喜欢
    • 2021-09-26
    • 2012-08-05
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多