Shell-Script
僅在成功的命令呼叫時重定向輸出
我想將命令的輸出(
diff
在這種情況下)重定向到一個文件,但前提是我正在比較的文件存在差異。例如,假設我有三個文件a
、b
和c
wherea
和b
是等價的,但a
不是c
。如果我做
diff a c > output.txt
ordiff 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
其作為“中間人”引入,這可能會引發一些問題。只有在沒有重複程式碼的輸出的情況下,如何重定向輸出/創建文件?
您可以呼叫該命令一次,重定向輸出,然後在沒有差異的情況下刪除輸出:
diff a c > output.txt && rm output.txt
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