以下のものがあるとします:
** 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
これは、私がやろうとしていることの目的上、無視できるものです。ただし、コードを実行して にパイプするとless
、xargs: zcat: terminated by signal 13
ステートメントが最初の行になります。これは望ましくありません。この警告/エラーではないエラーを抑制またはキャッチする方法はありますか?
答え1
エラーは、シグナルが送信zcat
されたためにPIPE
発生します。これは、2 回目(およびそれ以降のすべての実行時、最初のファイルを除く各ファイルに対して 1 回) に、(最初の行を出力するタスクが完了したため) が終了した後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に送信します)