2017-12-21 10 views
1

私は2つのコマンドのSTDOUTストリームを互いにリダイレクトする方法STDIN?

~$ command1 | command2 | command1 

ような何かをする必要があり、3つ目は、同じプログラムの別のインスタンスが、同じプロセスであってはなりません。私が正しく説明しているかどうかわからないので、別の意味で何を意味するのかもう一度試してみてください。

私は次のことを期待しています:Program1は何かを印刷し、Program2は何を印刷しますか? 、Program2は何かを印刷し、Program1はProgram2が印刷したものをスキャンします。 BASHの詳細な学習が私のせいだが、そのトリックをやることができれば、すみませんが、私はGoogleから適切な解決策を見つけられませんでした。

+1

おそらくhttps://unix.stackexchange.com/questions/53641/how-to-make-bidirectional-pipe-between-two-programs? – larsks

+0

多分あなたは 'command2'が' command1'のコプロセッシングであることを意味するかもしれません... http://wiki.bash-hackers.org/syntax/keywords/coproc –

答えて

1

一般的に言えば、あなたの質問は円で2つの処理エンティティ(プロセス)について話しているので、あまり意味がありません。この状況は鶏卵の状況であり、どこから始まり、どのように終わるのかという疑問が生じます。

具体的なユースケースについてもっと詳しくお話したい場合は、別のレベルでより良いアドバイスを提供して、問題の解決に役立てることができます。

しかし、私は@ mark-setchellのコメントはあなたがやりたいことを目指していると思います。 command2のようなサウンドは、コルーチンのcommand1です。これは、パラレルで実行され、データを受信し、必要に応じてデータを戻すことを意味します。 bashはそのようなことを知っていて、それをサポートしていますが、これは広く使われていないので、どこでもそれほど多くのサポートを期待しないでください。

例は多分使用を示す:

coproc SED while read a; do echo "$a" | sed 's/x/u/g'; done 
ls -l 1>&${SED[1]} 
cat 0<&${SED[0]} 
  • これは線にuによってxを置き換え、行を読み取り、ループを実行し、現在のシェルにコルーチン(coproc)を作成し、出力それらを再び。
  • 次に、ls -lを呼び出し、出力を実行中のコルーチンに送ります。
  • 最後の行は、最後に既存のコルーチンの出力を読み込み、stdoutに出力します。

最後の2つのステップは、コルーチンが動作し続けるため、繰り返し実行できます。

+0

純粋なCIでは、C++ではpthread 。私の場合は、オペレーティングシステム自体によって行われるはずです。本当ですか? –

+0

あなたの質問を変更しないでください;-)あなたはC/C++に関するものではなく、シェルの物について尋ねました。この質問を参考にして、様々な側面についてのフォローアップの質問を自由に投稿できます。 – Alfe

+0

私はこれで意味することを指摘しました。 C++の場合と同様に、2つの文字列(thread1 sscanf -s * S1とsprintf-s * S2、thread2 sscanf-s * S2、sprintf-s * S1)でこれを行うことができます。私はモノスレッドプログラムを2つ持っています。もちろん、無限ループを避けるために、お互いを十分に理解するように両者に教えるつもりです。 COPROCを目指していただきありがとうございます、私はそのテーマを発見します。 –

関連する問題