Pipe
xargs 和 zcat:靜默錯誤
假設我有:
** 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
對於我正在嘗試做的事情,我可以忽略這一點。但是,如果我執行程式碼並將其通過管道傳輸到 a
less
中,則該xargs: zcat: terminated by signal 13
語句是第一行。這是不可取的。有沒有辦法抑製或擷取此警告/錯誤,即不是錯誤?
該錯誤是由於向其
zcat
發送PIPE
信號所致。發生這種情況是因為第二次zcat
執行(以及之後的所有其他時間,除了第一次之外的每個文件一次),它嘗試通過管道寫入到head
afterhead
已退出(由於完成了輸出第一行的任務) .您可以通過讀取所有產生的數據來避免產生這個特定的錯誤
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
因為它只執行一次,而不是目錄中的每個文件。這將具有額外的好處,它可以處理任何有效的文件名(例如,帶有嵌入換行符的名稱)。