【问题标题】:Expect send to other process期望发送到其他进程
【发布时间】:2015-01-11 10:32:01
【问题描述】:

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

生成 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

【问题讨论】:

  • 您是否需要捕获 b.sh 的输出并将其作为输入发送到 a.sh?

标签: tcl expect


【解决方案1】:

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

这是因为如果不这样做,我们将错过生成过程中发生的事情,因为expect 将假定您只需要发送一个字符串值,而不期待会话中的任何其他内容。

后面的代码

send "ian\n"

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

“那么,为什么interact 起作用了?”。我听到你了。

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

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

【讨论】:

    【解决方案2】:

    我刚刚使用

    spawn "./a.sh"
    set a $spawn_id
    expect "enter"
    
    spawn "./b.sh"
    expect eof
    
    set spawn_id $a
    send "ian\n"
    
    interact
    

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

    【讨论】:

    猜你喜欢
    • 2020-12-20
    • 2018-04-28
    • 2012-05-04
    • 2016-03-21
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    相关资源
    最近更新 更多