使用重定向时避免创建空文件

使用重定向时避免创建空文件

foo | bar > out.txt通常会将输出保存到out.txt.

但是,如果foo失败,那么显然bar不能有任何输出,因此创建out.txt.然而,通常的结果是,当foo失败时out.txt,会创建一个空的。

我经常在 Makefile 中使用这种类型的命令,其中问题变得更加复杂:一旦创建空文件,该make命令就会停止工作,因为 make 会看到空文件并决定不需要再次创建它。

out.txt如果管道从未达到标准,有没有办法不被创建?

答案1

对于 Makefile 的情况,始终将其创建为临时文件,然后重命名。

out.txt: in.txt
       set -o pipefail ; foo $< | bar > [email protected]
       mv [email protected] $@

(当然使用制表符而不是空格)。

这可以扩展为构建过程中的快捷方式

out.txt: in.txt
       set -o pipefail ; foo $< | bar > [email protected]
       cmp -s [email protected] $@ || mv -f [email protected] $@

如果生成的 out.txt 文件没有更改,则修改时间不会更新,这意味着依赖于未更改的 out.txt 的东西不需要重建。

答案2

这有帮助吗:

foo_output="$(foo)"
test -n "${foo_output-}" && bar_output="$(bar <<< $foo_output)"
test -n "${bar_output-} && echo "$bar_output" > output

相关内容