考虑以下脚本
#!/usr/bin/env bash
set -eux
set -o pipefail
function will_fail() {
echo 'I do not work because of xyz' >&2
exit 1
}
will_fail | gzip > test.gz
这将创建一个文件test.gz
有没有办法让管道停止will_fail
而不创建test.gz
?
答案1
由于输出文件是在管道启动之前创建的,因此无法阻止创建输出文件。
因此,您唯一的机会就是再次删除该文件,以防管道失败。
如果您正在寻找脚本解决方案,则可以使用支持的A kshism
(陷阱)。ERR
bash
在这种情况下,我强烈建议使用
set -o noclobber
为了防止文件在之前已经存在的情况下被破坏。
所以推荐的代码看起来像这样:
set -o noclobber
trap 'rm -rf test.gz' ERR
some_cmd | gzip > test.gz
答案2
if ! will_fail | gzip >test.gz; then
rm -f test.gz
fi
这不会阻止文件的创建(重定向将在管道执行之前创建文件),但如果管道失败,它会删除该文件(假设pipefail
已设置,如示例中所示)。