示例#1

示例#1

我正在玩coprocBash,但我无法理解一些东西。

我从以下示例开始:

示例#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

这里有几个问题......

首先,需要使用-iPython的选项,使其进入交互模式并从stdin读取命令来执行。所以:

coproc MY_BASH { python -i ; }

接下来,Python 不使用分号分隔命令,因此您需要使用换行符来分隔命令:

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

相关内容