仅在命令调用成功时重定向输出

仅在命令调用成功时重定向输出

我想将命令的输出(diff在本例中)重定向到文件,但前提是我正在比较的文件存在差异。例如,假设我有三个文件ab、 ,c其中ab是等价的,但ac不是。

如果我这样做diff a c > output.txtdiff a b > output.txt,无论是否有差异,output.txt都会被创建。我只想output.txt在存在差异时创建(即差异返回 1)。

我想做类似的事情:

if ! diff a c > /dev/null; then
    diff a c > output.txt
fi

但无需运行该命令两次。我可以像这样保存命​​令的内容:

res=$(diff a c)
if [ $? != 0 ]; then
    echo "$res" > output.txt
fi

但随后我echo以“中间人”的身份介入此事,这可能会引发一些问题。如何仅在有输出的情况下重定向输出/创建文件而不重复代码?

答案1

您可以调用该命令一次,重定向输出,然后在没有差异的情况下删除输出:

diff a c > output.txt && rm output.txt

答案2

diff是一个相对昂贵的命令,至少如果文件不同的话。计算最小的更改集是(相对)CPU 密集型的。因此,不想这样做两次是可以理解的。

cmp然而,就 CPU 而言,它很便宜。假设这些文件的大小合理(我怀疑您会在多 GB 文件上调用 diff),那么它几乎没有性能成本,并且在文件相同的情况下甚至可能更快。

if ! cmp -s a c; then # -s = silent, do not print results to console
    diff a c > output.txt
fi

答案3

临时文件呢?

diff a c > /tmp/output.txt
if [ $? != 0 ]; then mv /tmp/output.txt /my/folder/output.txt; else rm -f /tmp/output.txt; fi

如果您想要删除确认对话框,请替换-f为。-i

这样,您只需运行命令两次,没有临时变量,也没有“中间人”,无论是 echo、printf 还是其他任何东西。

相关内容