xargs 和 zcat:沉默錯誤

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語句是第一行。這是不可取的。有沒有辦法抑製或捕捉此警告/不是錯誤的錯誤?

答案1

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

您可以透過讀取產生的所有資料來避免產生此特定錯誤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'

或者看愛德華多·特拉帕尼的回答如何簡單地忽略錯誤。

另一種方法是僅解壓縮第一個檔案:

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

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

答案2

即使您在第一行看到該訊息,它也不會寫入標準輸出,而是寫入標準錯誤。

所以,這應該有效:

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

它丟棄標準錯誤輸出(將其發送到/dev/null)

相關內容