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

私は私がしたいことのためにこれを無視できます。ただし、コードを実行してそれにパイプすることで、そのステートメントが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これには、有効なファイル名(改行を含むファイル名など)を処理できるという利点があります。

おすすめ記事