私が持っているとしましょう:
** 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回目のzcat
実行時に(そしてそれ以降は最初のファイルを除く各ファイルに対して1回)終了後(Taskの最初の行の出力が完了したため)、パイプを介して書き込みを試みるために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 に送信)。