FIFOによる出力分配

FIFOによる出力分配

私は次のように非常に長いmake出力を配布したいと思います。

mkfifo myfifo 
make 2>&1 | tee myfifo | grep -E "errors|warnings" myfifo > errors.log | cat myfifo

アイデアは、出力のサブセットをログファイルにコピーし、出力全体がコンソールの標準出力にリダイレクトされることです。

最初は動作しているようですが、突然停止してCtrl-Zを押すまで停止状態を維持します。

プロセス代替の活用

make 2>&1 | tee >(grep -E "errors|warnings" > errors.log)

シェルは、コンパイル時にデフォルトでPOSIX標準に厳密に従うため、不可能です。

プラットフォーム - Ubuntuスタイルのディストリビューション。 shell bash 4.2 (1 つのみ使用可能)

ベストアンサー1

それ

make 2>&1 | tee myfifo | grep -E "errors|warnings" myfifo > errors.log | cat myfifo
          P1           P2                                              P3

コマンドは意味がありません。パイプを挟んでこの4つのコマンドを同時に起動します。

  • make 2>&1:stdout と stderr は P1 に移動します。
  • tee myfifo:標準入力はP1、標準出力はP2になります。したがって、tee出力はP2myfifoとP2に書き込まれます。
  • grep -E "errors|warnings" myfifo > errors.logmyfifo:P2の標準入力から取得しますが、ファイル名()を渡すため、grep標準grep入力から読み取られません。標準出力はに行き、errors.logP3には何も記録されません。
  • cat myfifo:P3の標準入力ですが、catファイル名が与えられているため、再度読み込みます。だから2つをgrep同時に読みます。catmyfifo

P2では何も読みませんので、teeP2がいっぱいになると停止します。読み取った部分も表示されませんcatmyfifogrep

make 2>&1 | tee myfifo | grep -e errors -e warnings > errors.log | cat myfifo

おっしゃった内容に近いと思います。繰り返しますが、P3は使用されませんが、|同時に起動してcat待機するために使用します。

またはこれを行うこともできます:

make 2>&1 | tee myfifo & grep -e errors -e warnings > errors.log
wait

より多くのsが必要な場合は、grepより多くのfifoが必要です。

make 2>&1 | tee fifo2grep1 fifo2grep2 &
grep errors fifo2grep1 > errors.log &
grep warnings fifo2grep2 > warnings.log
wait

サポートされているシステムでは、/dev/fd/x次のこともできます。

make 2>&1 | { tee /dev/fd/3 | grep -e errors -e warnings 3>&-; } 3>&1

(これは通常、これをサポートするシェルでプロセス置換が実行される操作です。)

2秒であればgrep次のようになります。

make 2>&1 |
 {
   {
     tee /dev/fd/3 /dev/fd/4 |
       grep errors > errors.log 3>&- 4>&-
   } 4>&1 |
     grep warnings > warnings.log 3>&-
 } 3>&1

おすすめ記事