unimrcp 클라이언트 프로세스(ucp)가 있고 쉘 스크립트를 사용하여 여러 ucps를 생성하려고 합니다.
ucp를 생성할 때마다 ucp의 다양한 기능에 액세스할 수 있는 명령줄이 반환됩니다. 그래서 저는 다음과 같은 목표를 달성하기 위해 스크립트를 작성하고 싶습니다.
- UCP 프로세스 생성
- ucp 명령줄이 나타날 때까지 기다립니다.
- ucp의 기능에 액세스하려면 "run Recog" 명령을 사용하십시오.
./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 &
그런 다음 위 스크립트를 실행할 수 있지만 셸에서 호출하기로 결정했습니다.
그런데 간단한 echo blah | ...
stdin은 프로그램이 입력을 삭제할 수 있기 때문에 때때로 실패합니다. 예를 들어 프로그램은 해당 입력을 읽고 삭제하여 첫 번째 프롬프트를 표시하기 전에 모든 입력을 삭제할 수 있습니다.
% 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