例 #1

例 #1

Bashで遊んでいるのにcoproc何か分かりません。

次の例から始めます。

例 #1

$ coproc MY_BASH { bash; }
[1] 95244
$ echo 'ls -l; echo EOD' >&"${MY_BASH[1]}"
$ is_done=false; while [[ "$is_done" != "true" ]]; do
>   read var <&"${MY_BASH[0]}"
>   if [[ $var == "EOD" ]]; then
>      is_done="true"
>   else
>      echo $var
>   fi
> done
total 0
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file10.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file1.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file2.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file3.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file4.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file5.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file6.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file7.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file8.txt
-rw-rw-r-- 1 username username 0 Nov 11 13:00 file9.txt
$ 

ここでは、現在のBashシェルが共同プロセスを作成して対話できることがわかります。

実施例2

この場合は、bashcoprocessからcoprocessに切り替えますpython

$ coproc MY_BASH { python; }
[1] 95244
$ echo 'print("hello"); print("EOD");' >&"${MY_BASH[1]}"
$ is_done=false; while [[ "$is_done" != "true" ]]; do
>   read var <&"${MY_BASH[0]}"
>   if [[ $var == "EOD" ]]; then
>      is_done="true"
>   else
>      echo $var
>   fi
> done

この場合、プログラムは中断されブロックされます。

入力に何かを送ることを忘れてしまったようです。

何が起こっているのかをよりよく理解するのを手伝ってくれてありがとう。

答え1

ここにいくつかの質問があります...

まず-i、Pythonのオプションを使用してインタラクティブモードに切り替え、stdinからコマンドを読み込んで実行する必要があります。だから:

coproc MY_BASH { python -i ; }

次に、Pythonはコマンドを区切るためにセミコロンを使用しないため、コマンドを区切るには改行を使用する必要があります。

echo $'print("Hello, World!")\nprint("EOD")' >&"${MY_BASH[1]}"

関連情報