単一のファイル記述子の読み取りと書き込みを別の場所に送信するには?

単一のファイル記述子の読み取りと書き込みを別の場所に送信するには?

foofd 0から入力を読み込み、出力をfd 0に書き込むLinux実行可能ファイルがあります(いいえFD1)。これは端末で対話的に使用するのに適しています。

シェルのコマンドラインで、あるファイルからfd 0を読み込み、別のファイルにfd 0を書き込むようにこのプログラムをどのように実行しますか?

私が考えることができる最も良いのは$ goo input.txt output.txt | fooどこかにヘルパーgooがあることですが、既存のヘルパーがあるかどうかわからず、設定中のパイプが双方向なのかもしれません|

答え1

使用socat(バージョン2以降):

socat 'system:cat input.txt & cat > output.txt,commtype=socketpair' \
      'system:foo,nofork'

または、より良い方法は次のとおりです。

socat 'CREATE:output.txt%OPEN:input.txt' 'system:foo,commtype=socketpair'

私たちは双方向を使用していますsocketpair(Linuxのパイプは双方向ではありません)。別のオプションは、上記の方法で疑似端末(双方向)を使用することですcommtype=pty。端末と通信したい場合は、fooこの方法がより良い方法かもしれません。

または、次のsocketpair方法を実装できますperl

perl -MSocket -e '
  socketpair(A, B, AF_UNIX, SOCK_STREAM, PF_UNSPEC);
  if (fork) {
    close A;
    if (fork) {
      open STDOUT, ">&B";
      exec("cat", "input.txt")
    }
    open STDIN, "<&B";
    open STDOUT, ">output.txt";
    exec("cat")
  }
  close B;
  open STDIN, "<&A";
  exec "foo"'

(ここでは、クイックコンセプト証明でエラーチェックを追加し、多くのプロセスを使用せずに実行を防ぐことで、より効率的にすることができますcat。)

関連情報