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