2013-02-05 3 views
7

は言う最終的なプログラムの標準入力の両方から結果を収集します出力は指定された入力に対して正しいです(したがって、両方のファイルが必要です)。重複STDOUT、パイプは、私は三つのプログラムを持っている

私が現在やっていることは次のとおりです。out.txtをin.txt & &猫out.txtを> in.txt & &プロセッサ< in.txt

ジェネレータ> |検証者

明示的なファイルを使用せずに同じ結果を得ることは可能ですか?私はteeとプロセス代入を使って入力を複製することについて読んだことがありますが、最後のステップでは両方のストリームを1つに集める方法はありませんでした。

答えて

1

あなたが出力するプロセッサ・コードを変更することができた場合は順次stdinその後、stdout 1行のコマンドは、このような単純なことができます

generator | processor | verifier 

それ以外の場合は、あなたがこの

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

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

は、私はあなたが複製しstdoutからstdinをリダイレクトする方法を探しているが、私はこれを認識していないんだと正直に私はあなたが作成したくない場合は、それは

+1

私はin.txtがで書き込みを行うことになるという保証はありませんので、私はこのアプローチを試みたが、それは動作しませんでしたと思いますteeを実行すると、検証者が読み込みを開始します(空のファイルの読み込みが終了しました)。 –

+0

入力パラメータの妥当性を検証することは、すべてのプロセスの義務です。入力パラメータが無効な場合に返します。 –

+0

@KimStrauss、 'verify 'に送られた' generator'と 'processor'行の同期をしたいなら、' processor'がインターリーブを行うように手配しなければなりません。そうでなければ、DavideBerraの答えによって与えられた行に沿って何かを実行してください:どこかで出力されたものを出力し、両方で 'verifier 'を呼び出してください。 – vonbrand

2

可能であるとは思わない知っていますあなたの遅いハードディスク上の実際のファイルでは、振る舞いのためにという名前のパイプと呼ばれるFIFO(先入れ先出し)を使用することができます。

mkfifo myfifo 
generator | tee myfifo | processor | verifier myfifo 

これはverifierprocessorを通じてパイプさmyfifoおよびstdoutにそれを複製teeに生成されたコンテンツを、ストリーム。また、verifierはストリームをmyfifoから取得します。

2

私はこれをテストしたが、しようとしていない:

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

はこのstderrgenerator出力のコピーをリダイレクトします。次にstdoutprocessorgeneratorに実行します。次にパイプをverifierに結合します。

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


代わりに、あなたは以下のようなプロセス置換を試すことができます。

(generator | tee >(processor)) | verifier 
+1

最後は美しいです。 – ffledgling

関連する問題