【问题标题】:How do I redirect stdout from a program continuously into a spawned process using expect?如何使用期望将程序中的标准输出连续重定向到生成的进程中?
【发布时间】:2017-05-19 13:04:05
【问题描述】:

需要打开telnet,发送一些命令,然后从pocketsphinx发送stdout。

目前expect会等到程序结束,然后将所有内容输出到telnet进程。 我需要pocketspix 来持续为生成的telnet 进程提供数据。

这是我目前所拥有的:

#!/usr/bin/expect -d
set send_human {.1 .3 1 .05 2}
spawn telnet 192.168.1.104 23
expect “*”
send "\x01"; send "2\r"
expect “:”
send -h "hello world\r"
send -h "goodbye world\r"
send -h "Test Test Test\r"
send -- [exec pocketsphinx_continuous -infile speech.wav 2> /dev/null ]\n

【问题讨论】:

    标签: bash tcl expect


    【解决方案1】:

    您可以使用 expect 命令interact 将两个衍生进程连接在一起。

    默认情况下,interact 期望用户正在编写 stdin 并读取 Expect 进程的 stdout 本身。 -u 标志(用于“用户”)使交互查找用户作为由其参数命名的进程 (必须是生成的 id)。

    这允许在不使用显式循环的情况下将两个不相关的进程连接在一起。为了帮助 调试,Expect 诊断总是转到标准错误(或某些日志记录和调试信息的标准输出)。 出于同样的原因,解释器命令将以交互方式从标准输入中读取。

    例如

    set send_human {.1 .3 1 .05 2}
    spawn telnet 192.168.1.104 23
    expect “*”
    send "\x01"; send "2\r"
    expect “:”
    send -h "hello world\r"
    send -h "goodbye world\r"
    send -h "Test Test Test\r"
    
    set sid_telnet $spawn_id
    spawn pocketsphinx_continuous -infile speech.wav 2> /dev/null 
    
    interact -u $sid_telnet
    

    【讨论】:

    • interact 是否适用于交互式程序是 curses 程序的情况?
    • 当然,它适用于任何使用终端的程序
    猜你喜欢
    • 2011-08-31
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多