Bashでサブシェルの匿名読み取り/書き込みパイプを作成できますか?

Bashでサブシェルの匿名読み取り/書き込みパイプを作成できますか?

別のスクリプトに添付されている読み取り/書き込みファイル記述子として、「解決サービス」をbashスクリプトに渡そうとします。

したがって、次の「サービス」が提供されますcapitalize

#!/usr/bin/env bash
while true; do read line; echo "${line^}"; done

クライアントは次のとおりですclient

#!/usr/bin/env bash
echo $1 >&3
read line <&3
echo "${line}"

電話をかけてclient foo 3< <(capitalize)結果を期待したいですFoo。この呼び出しは表示で失敗しますclient: line 2: echo: write error: Bad file descriptor。これは、公開されたパイプ(capitalize割り当てられてfd3渡されたclient)が読み取り - 書き込みではなく読み取り専用であるためです。

そのため、2つのシェル間で共有できる読み取りおよび書き込みパイプを作成する構文を探しています。たぶん似ているかもしれませんが、うまくclient foo 3<> <>(capitalize)いきません。

よろしくお願いします!


以下は、coproc対話型シェルを使用する簡単な例です。

$ coproc cap { read line; echo ${line^}; }
$ echo ${cap[@]}
59 54
$ echo foo >&54
$ read line <&59
[1]+  Done                    coproc cap { read line; echo ${line^}; }
$ echo $line
Foo

クライアントにファイル記述子を送信するときに、構文をまだ把握できませんでした。

client次のように、入力と出力に異なるファイル記述子を使用するように更新するとします。

#!/usr/bin/env bash
echo $1 >&3
read line <&4
echo "${line}"

それではこれをしましょう...

$ coproc SVC { ./capitalize; }
$ ./client foo 3>&${SVC[1]} 4<&${SVC[0]}
./client: line 2: 3: Bad file descriptor
./client: line 3: 4: Bad file descriptor

1と0のファイル記述子SVCがスロット3と4にコピーされて配信されないのはなぜですか./client

うーん…ほぼすべて来ました…

関連情報