Ter*_*ryA 6 shell io-redirection shell-script posix
我想将命令的输出(diff在这种情况下)重定向到一个文件,但前提是我比较的文件存在差异。例如,假设我有三个文件a、b、 和cwherea和b是等价的但a和c不是。
如果我做diff a c > output.txtor diff a b > output.txt,不管有没有区别,output.txt都会被创造出来。我只想output.txt在有差异时被创建(即差异返回 1)。
我想做类似的事情:
if ! diff a c > /dev/null; then
diff a c > output.txt
fi
Run Code Online (Sandbox Code Playgroud)
但是没有运行命令两次。我可以像这样保存命令的内容:
res=$(diff a c)
if [ $? != 0 ]; then
echo "$res" > output.txt
fi
Run Code Online (Sandbox Code Playgroud)
但后来我echo以“中间人”的身份参与进来,这可能会引发一些问题。仅当有输出而不复制代码时,如何重定向输出/创建文件?
您可以调用该命令一次,重定向输出,然后在没有差异的情况下删除输出:
diff a c > output.txt && rm output.txt
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
临时文件呢?
diff a c > /tmp/output.txt
if [ $? != 0 ]; then mv /tmp/output.txt /my/folder/output.txt; else rm -f /tmp/output.txt; fi
Run Code Online (Sandbox Code Playgroud)
更换-f用-i,如果你想删除确认对话框。
这样你只运行命令两次,没有临时变量,也没有“中间人”,无论是 echo、printf 还是其他任何东西。