我正在玩coproc
Bash,但我无法理解一些东西。
我从以下示例开始:
示例#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 shell 能够创建一个协进程并与其交互。
实施例2
在这种情况下,我从bash
协进程切换到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]}"