1

私は必死です。パイプのマルチチェーンのリファレンス/ソースコードを1か月間探しています。つまり、何かを実行できるということです。

     cat /tmp/test.log  | wc -l --> stdout
                        | grep test1 --> stdout
                        | grep test2 | grep test3 |
                                                  | grep test4 --> stdout
                                                  | grep test5 --> stdout

teeがファイルを処理している間はbash/tee /$...コマンドに送らないでください。bashは複雑すぎて理解できません...

注文は関係ありません。最初に終了したチェーンも処理されます。

4

2 に答える 2

0

すべてを一撃で粉砕しようとするのではなく、おそらく、行っていることを複数の小さなタスクに分割する必要があります。これは、あなたが望むのと同じことを行う BASH スクリプトですが、はるかに理解しやすいものです。

注: これはテストしていないため、問題がある可能性があります。

#!/bin/bash

FILENAME='/tmp/test.log'
TMPNAME='mktemp -t' || exit

wc -l $FILENAME
grep 'test1' $FILENAME
awk '/test2/ && /test3/ {print}' $FILENAME > $TMPNAME
grep 'test4' $TMPNAME
grep 'test5' $TMPNAME

rm $TMPNAME
于 2011-08-01T20:23:05.600 に答える
0

私は実際に学校のプロジェクトのために似たようなものを開発しなければなりませんでした. アイデアは、次のようなものを達成するためにパイプの概念を一般化することでした:

 process1  --> process2
           --> process3 --> stdout
           --> process4 --> process5 --> stdout
                        --> process6 --> stdout

(ループも可能)

これを行うために、私のプログラムは次のことを行いました。

  • パイプ グラフ (プロセスとパイプ) を含むファイルを解析する
  • fork() を使用して子プロセスを作成する
  • すべての子プロセスに対して、着信パイプの書き込み側を閉じ、発信パイプの読み取り側を閉じて、execl() を呼び出します。残りは、何を達成しようとしているかに応じて、子プロセスによって処理されます (デッドロックに注意してください!)。

私の場合、呼び出されるプロセスも私が開発したものなので、パイプ ファイル記述子を引数として子プロセス (--pipe-in​​ .... --pipe-out ....) に渡すだけで済みましたが、 stdin/stdout に基づく既存のプログラムを使用しているため、dup2() を使用して標準 I/O パイプを「コピー」できます。

これがあなたがこれを行う方法を計画しているかどうかはわかりませんが、その方法で実行可能です。

于 2011-11-13T15:27:27.923 に答える