私は次のように非常に長い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.log
myfifo
:P2の標準入力から取得しますが、ファイル名()を渡すため、grep
標準grep
入力から読み取られません。標準出力はに行き、errors.log
P3には何も記録されません。cat myfifo
:P3の標準入力ですが、cat
ファイル名が与えられているため、再度読み込みます。だから2つをgrep
同時に読みます。cat
myfifo
P2では何も読みませんので、tee
P2がいっぱいになると停止します。読み取った部分も表示されませんcat
。myfifo
grep
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
答え2
その後、grep -E "errors|warnings" myfifo > errors.log
パイプにはデータが含まれなくなります。したがって、cat myfifo
パイプから読み取られる次のコマンドはブロックされます。
あなたの質問を正しく理解したら、すべてのメッセージをstdoutとして印刷し、すべてのエラーと警告メッセージをerrors.log
。
mkfifo pipe1 pipe2
make 2>&1 | tee pipe1 pipe2 | grep -E "errors|warnings" pipe1 > errors.log | cat pipe2