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