我有一个非常简单的脚本,可以执行以下操作
#!/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完全退出。最干净的方法是什么?
答案 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在我发现此行为时的帮助。)