假設我有:
** 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)