Shell-Script

僅在成功的命令呼叫時重定向輸出

  • June 17, 2019

我想將命令的輸出(diff在這種情況下)重定向到一個文件,但前提是我正在比較的文件存在差異。例如,假設我有三個文件abcwhereab是等價的,但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

但是沒有執行命令兩次。我可以像這樣保存命令的內容:

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

引用自:https://unix.stackexchange.com/questions/524888