运行清理代码而不影响$?

运行清理代码而不影响$?

我有一个创建临时文件的函数。我希望该函数在退出之前删除临时文件,但我希望此清理不会影响函数中最后一个命令的 $?

IE

function doSomething {
  TMPFILE=$(mktemp)
  commandthatmightfail ${TMPFILE}
  rm ${TMPFILE}
}

doSomething
echo $? # should output the result of the commandthatmightfail line

目前我正实现以下目标:

function doSomething {
  TMPFILE=$(mktemp)
  commandthatmightfail ${TMPFILE} && \
  rm ${TMPFILE} || { 
    rm ${TMPFILE} 
    false
  }
}

虽然可行,但很麻烦。(如果 rm 由于某种原因失败,它也会返回 false,但这可能不是坏事)

我认为也可以通过将 $? 存储在变量中,然后在清理后返回它来实现,但我认为这不太干净。 有没有更好的方法?

注意:在我的场景中,我只关心零回报和非零回报

我确实研究过使用 bash trap RETURN,但它似乎不适合这个用例

答案1

我认为也可以通过将 $? 存储在变量中,然后在清理后返回它来实现,但我认为这不太干净。 有没有更好的方法?

不,但有一个明确的return 比试图通过神奇的方式实现它要干净和容易理解得多trap(特别是对于几年后将试图理解该函数的未来维护者而言)。其他语言(如 C)中也经常使用相同的模式。

doSomething() {
    local r=0 tmpfile=$(mktemp)
    commandthatmightfail "$tmpfile"; r=$?
    rm -f "$tmpfile"
    return $r
}

相关内容