期望发送到其他进程

Expect send to other process

我有一个执行以下操作的 expect 脚本:

Spawns a.sh -> a.sh 等待用户输入

生成 b.sh -> 运行并完成

我现在想向 a.sh 发送输入,但无法正常工作。

下面是我的期望脚本

 #!/usr/bin/expect
    spawn "./a.sh"
    set a $spawn_id
    expect "enter"

    spawn "./b.sh"
    expect eof

    send -i $a "test\r"

a.sh 是

read -p "enter " group
echo $group
echo $group to file > file.txt

并且b.sh是

echo i am b
sleep 5
echo xx

我刚刚使用

完成了这项工作
spawn "./a.sh"
set a $spawn_id
expect "enter"

spawn "./b.sh"
expect eof

set spawn_id $a
send "ian\n"

interact

我现在的问题是为什么最后需要互动?

基本上,expect 将使用两个可行的命令,例如 sendexpect。在这种情况下,如果使用 send,则之后必须有 expect(在大多数情况下)。 (反之亦然不是强制性的)

这是因为如果没有它,我们将错过派生进程中发生的事情,因为 expect 将假设您只需要发送一个字符串值而不期望会话中的任何其他内容。

以下代码后

send "ian\n"

我们必须让 expect 等待之后的事情。您已将 expect eof 用于生成的进程 a.sh 。同样,也可以为 b.sh 生成的进程添加它。

"Well, then why interact worked ?"。我听到你了。

它们的工作方式相同,只是 interact 会期望用户在交互式会话中输入一些内容。它显然对你有期望。但是,您当前的 shell 脚本并不是为了获取输入而设计的,它最终会退出,因为脚本中没有更多的代码,这就是您看到正确输出的原因。或者,即使单独使用 expect 代码(即使没有 eof)也可以解决问题。

查看 expect's man page 以了解更多信息。