Pipe

xargs 和 zcat:靜默錯誤

  • April 3, 2020

假設我有:

** EDIT TO HAVE CLOSER CORRESPONDENCE TO ACTUAL USAGE **

find ... -regex ... | head -n 1 | xargs -I {} zcat {} | head -n 1
# next, I do some other things

現在,一切正常。但是,該xargs -I {} zcat {}命令會產生以下錯誤:

xargs: zcat: terminated by signal 13

對於我正在嘗試做的事情,我可以忽略這一點。但是,如果我執行程式碼並將其通過管道傳輸到 aless中,則該xargs: zcat: terminated by signal 13語句是第一行。這是不可取的。有沒有辦法抑製或擷取此警告/錯誤,即不是錯誤?

該錯誤是由於向其zcat發送PIPE信號所致。發生這種情況是因為第二次zcat執行(以及之後的所有其他時間,除了第一次之外的每個文件一次),它嘗試通過管道寫入到headafterhead已退出(由於完成了輸出第一行的任務) .

您可以通過讀取所有產生的數據來避免產生這個特定的錯誤zcat。您可以通過以下方式執行此操作

ls files/* | xargs -I {} zcat {} | { head -n 1; cat >/dev/null; }

或者

ls files/* | xargs -I {} zcat {} | sed -n 1p

或者

ls files/* | xargs -I {} zcat {} | awk 'NR == 1'

或者查看Eduardo Trapani 的回答,了解如何簡單地忽略錯誤。

另一種方法是僅解壓縮第一個文件:

set -- files/*
zcat "$1" | head -n 1

這不會觸發PIPE信號,zcat因為它只執行一次,而不是目錄中的每個文件。這將具有額外的好處,它可以處理任何有效的文件名(例如,帶有嵌入換行符的名稱)。

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