foo
fd 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
。)