Bash: 进程之间通过管道相互交互

Bash: Mutual interaction of processes via pipes

环境: Linux/Docker,bash 版本 4.2。

问题:

我尝试了 coproc 的多种设置。但是,我要么 运行 陷入停滞状态,要么 没有收到数据。如何在 bash 中实现如下所示的设置?

                       .------>------------------------.
     .---------.       |         .------------.  stdin |       .-----------.
     | user    |-------'         | server-app |<-------+-------| client.sh |
     | console |<--+-------------|            |     .--------->|           |
     '---------'   |      stdout '------------'     |          '-----------'
                   '--------------------------------'

我的尝试:

coproc server.app

function expect { local expectation=
        # read from pipe until $expectation occurs in the input stream
        # when found, echo the line to 'stdout'
        echo "EXPECT: '$expectation'"
        while true; do
            read text <&"${COPROC[0]}"
            if [[ "$text" == *"$expectation"* ]]; then
                    echo $text 
                    break
            fi
        done
}

function send { local command=
        # send $command through pipe 
        echo "SEND: $command"
        echo "$command" >&"${COPROC[1]}"

}


expect "Conected to URL" 
send   "open"
expect "Session keepalive"
send   "session open"

# use the reported session identifier to setup the user command
session_n=$(expect "Identifier of Session created" | cut -d' ' -f5)    
command=$(echo "$user_command" | sed -e "s/SESSION/$session_n/g")

最后三行仅演示了对[=​​13=]的可能处理 输出。这又有什么问题呢?怎么才能发挥作用。

如@sexpect 所述,'natural' 解决问题的方法是 expect。此工具将基于 Tcl 的脚本作为输入。

 spawn server-app

将在 expect 的控制下启动 server-appexpect也是这些脚本中的关键字。

 expect -re "something (..)"

等待匹配表达式 something (..).

的输出
 send ...

向应用程序发送一些字符。

expect_tty ...

从启动 expect 脚本的用户那里获取一些输入。