我有一个 unimrcp 客户端进程 (ucp),我想使用 shell 脚本生成多个 ucp。
每当我生成 ucp 时,它都会返回一个命令行,使用它我可以访问 ucp 中的不同功能。所以我想写一个脚本来实现以下目标,
- 生成 ucp 进程
- 等待ucp的命令行出现
- 使用命令“run recog”访问 ucp 的功能
请注意,./ucp && run recog 不起作用,因为 ./ucp 仅在我们退出 ucp 命令行后才完成。
为此,我尝试了以下方法,
#!/bin/bash
./ucp &
fg
echo "run recog uni2"
wait
然而,./ucp &
结果是启动客户端进程然后写入“??????”在客户端控制台上导致“???”找不到命令。以下是日志,
./script.sh
2018-10-23 14:36:53:618851 [INFO] Set Property ip:127.0.0.1
2018-10-23 14:36:53:618851 [INFO] Register Codec [PCMU]
2018-10-23 14:36:53:618851 [INFO] Register Codec [PCMA]
2018-10-23 14:36:53:618851 [INFO] Register Codec [L16]
2018-10-23 14:36:53:618851 [NOTICE] Register Resource [speechsynth]
2018-10-23 14:36:53:618851 [NOTICE] Register Resource [speechrecog]
2018-10-23 14:36:53:620588 [NOTICE] Register Resource [recorder]
2018-10-23 14:36:53:620588 [NOTICE] Register Resource [speakverify]
2018-10-23 14:36:53:620593 [INFO] Register Resource Factory
2018-10-23 14:36:53:620600 [NOTICE] Create SofiaSIP Agent [SIP-Agent-1] [1.12.11-227-g73efc97] sip:127.0.0.1:8062;transport=udp
2018-10-23 14:36:53:620600 [INFO] Register Signaling Agent [SIP-Agent-1]
2018-10-23 14:36:53:620600 [NOTICE] Create RTSP Client [RTSP-Agent-1] [100]
2018-10-23 14:36:53:620600 [INFO] Register Signaling Agent [RTSP-Agent-1]
2018-10-23 14:36:53:620600 [NOTICE] Create MRCPv2 Agent [MRCPv2-Agent-1] [100]
2018-10-23 14:36:53:620600 [INFO] Register Connection Agent [MRCPv2-Agent-1]
2018-10-23 14:36:53:620600 [NOTICE] Create Media Engine [Media-Engine-1]
unknown command: ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
这是实现我在问题中提到的正确方法吗? (生成客户端并在其控制台上运行命令)?如果是,为什么“./ucp &”会导致读取“??????”考虑将其作为控制台的输入?请注意,如果我只是从控制台触发“./ucp & fg”,则不会发生这种情况。当我从控制台执行该命令时,它可以看到该命令的预期行为。当我尝试执行脚本时出现此问题。
如果这不是正确的方法,我怎样才能实现我在问题中提到的目标? (1、2、3)
更新 -
./ucp &
将控制权返回给进程(我认为是后台进程),该进程将终端上打印的任何输出视为 ./ucp 控制台的输入。我想我是否需要以某种方式将 IO 控制转移到 ./ucp 进程?没有把握..
谢谢
答案1
复杂的方法是使用expect
它伪造一个完整的终端来让进程在以下位置运行:
#!/usr/bin/env expect
# Spawn a ucp process
spawn -noecho ucp
# wait until the ucp's command line appears
expect -ex "whatever the ucp command line prompt looks like here"
# access ucp's functionality with a command "run recog"
send -- "run recog\r"
# not sure what needs to happen here, so let's wait for
# ucp to exit (may also need to handle timeout or
# the output buffer being full or ...)
expect eof
runucp &
然后,您可以按照您决定在 shell 中调用的方式运行上述脚本。
顺便说一句,更简单的echo blah | ...
标准输入法有时会失败,因为程序可以丢弃输入,例如程序可以通过读取和丢弃该输入来在显示第一个提示之前丢弃所有输入:
% cat prompter
#!/usr/bin/env expect
sleep 3 ;# simulate load of something big and bloated
read stdin ;# toss any existing input
puts -nonewline "prompt> "
puts "got >>>[gets stdin]<<<"
% print -l a b c d e f g | ./prompter
prompt> got >>><<<
或通过tcflush(3)
电话。expect
允许通过expect -x "detect prompt here"
指示生成的进程可能已启动并准备好输入的调用来避免这种情况。
答案2
ucp
接受标准输入上的输入吗?如果是,请尝试通过管道传输您的命令:
echo "run recog" | ./ucp