在bash中,清理后以前一个命令的状态退出的最佳方法是什么

时间:2014-10-28 01:03:01

标签: bash

我有一个非常简单的脚本,可以执行以下操作

#!/bin/bash$
/some/path/buildAll.sh \
&& filepath=/tmp/`cat /some/path/conf/version`.tar.gz \
&& (cd /some/path && tar czf $filepath .) \
&& push_file_to_web $filepath

我想用rm $filepath清理tarball,无论上面是否成功,都退出整个命令的状态。换句话说,当包括清理的每个步骤都成功时,脚本应该以状态0完全退出。最干净的方法是什么?

1 个答案:

答案 0 :(得分:5)

通常,最佳做法是使用EXIT陷阱:

#!/bin/bash

cleanup() { rm -f "$filepath" || exit $?; }
trap cleanup EXIT

foo && bar && baz

如果你不想定义一个函数,我可以写得更简洁:

trap 'rm -f "$filepath" || exit $?' EXIT

除非rm失败,否则陷阱不会修改退出状态。


(顺便说一句:虽然exit $? 通常 ,但如果没有参数调用,则exit的默认行为完全相同,但在EXIT陷阱中不是这样;在这种情况下,参数实际上是必要的,以覆盖预陷阱退出状态。感谢@5gon12eder在我发现此行为时的帮助。)