如果命令失败则 bash 停止管道

如果命令失败则 bash 停止管道

考虑以下脚本

#!/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(陷阱)。ERRbash

在这种情况下,我强烈建议使用

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已设置,如示例中所示)。

相关内容