8

プロセッサに供給される入力データを生成するgeneratorと、指定された入力に対してプロセッサの出力が正しいかどうかを確認できるverifierの3 つのプログラムがあるとします (したがって、両方のファイルが必要です)。

私が現在行っていることは次のとおりです。

ジェネレーター > in.txt && プロセッサー < in.txt > out.txt && cat in.txt out.txt | 検証者

明示的なファイルを使用せずに同じ結果を達成することは可能ですか? ティーとプロセスの置換を使用して入力を複製することについて読んだことがありますが、最終ステップのために両方のストリームを単一のストリームにまとめる方法が見つかりませんでした。

4

3 に答える 3

3

低速のハードディスク上に実際のファイルを作成したくない場合は、FIFO(First In First Out)を使用できます。これは、その動作から名前付きパイプとも呼ばれます。

mkfifo myfifo
generator | tee myfifo | processor | verifier myfifo

これにより、生成されたコンテンツがにストリーミングされtee、に複製されmyfifo、にstdoutパイプprocessorされverifierます。また、verifierからストリームを取得しますmyfifo

于 2013-02-05T10:54:06.020 に答える
3

私はこれをテストしていませんが、試してみてください:

{ generator | tee /dev/stderr | processor ; } 2>&1  | verifier

これにより、出力のコピー がにリダイレクトされます。次に、のを実行します。次に、両方を組み合わせて、にパイプします。generatorstderrprocessorstdoutgeneratorverifier

ただし、これは、ジェネレーターとプロセッサーからのラインがベリファイアに到達する順序を保証することはできません。


または、次のようにプロセス置換を試すこともできます。

( generator | tee >(processor) ) | verifier
于 2013-02-05T13:04:15.407 に答える
1

プロセッサコードを変更して順次出力できる場合stdinstdout1行のコマンドは次のように単純になります。

generator | processor | verifier

それ以外の場合はこれを使用できます

generator | tee in.txt | processor | verifier in.txt

teeコマンドは、を複製し、stdout一方のストリームを次のパイプにリダイレクトin.txtし、もう一方を次のパイプにリダイレクトします。この場合、からverifierの出力を読み取るように変更する必要があり、によって生成されたファイルがパラメータとして渡されます。processorstdingenerator

stdinを複製してリダイレクトするメソッドを検索していることは知っていますstdoutが、私はこれに気づいていません。正直なところ、それは不可能だと思います。

于 2013-02-05T10:40:56.033 に答える