我希望使用bash脚本来控制已编译的C程序X的执行流程。程序X只生成文本输出,我希望在打印某个字符串时立即暂停执行。在此之后,我想切换到bash并执行一些命令然后返回到完成X.我已经完成了一些阅读和测试,并且只期望/ bash脚本似乎满足了我的需求。但是,我在实现目标方面遇到了困难。
我已尝试在期望脚本中生成X ,然后期望“mystring”,然后发送 bash脚本命令,但这只会导致X终止后执行bash命令。
有谁知道实现这一目标的方法?为了澄清,我不能在这种情况下使用gdb。
#!/usr/bin/expect
spawn X
expect "mystring"
send -- "bash command"
答案 0 :(得分:1)
我会生成一个shell而不是直接生成X.然后你可以使用shell向程序发送一个SIGSTOP来暂停它(除非程序有能力在你直接向它发送内容时暂停)。
演示
#!/usr/bin/expect -f
spawn bash
send "unset PROMPT_COMMAND; PS1=:\r" ;# I have a fairly tricky bash prompt
expect -re ":$"
# this stands-in for "X": start a shell that sends stuff to stdout
send {sh -c 'n=1; while [ $n -lt 10 ]; do echo $n; sleep 1; let n=n+1; done'}
send "\r"
# when I see "5", send a Ctrl-Z to suspend the sh process
expect 5 {send \x1a}
expect -re ":$"
# now do some stuff
send "echo hello world\r"
expect -re ":$"
send "echo continuing\r"
expect -re ":$"
# and re-commence "X"
send "fg\r"
expect -re ":$"
# and we're done
send "exit\r"
expect eof
并运行它:
$ expect intr.exp
spawn bash
unset PROMPT_COMMAND; PS1=:
$ unset PROMPT_COMMAND; PS1=:
:sh -c 'n=1; while [ $n -lt 10 ]; do echo $n; sleep 1; let n=n+1; done'
1
2
3
4
5
^Z
[1]+ Stopped sh -c 'n=1; while [ $n -lt 10 ]; do echo $n; sleep 1; let n=n+1; done'
:echo hello world
hello world
:echo continuing
continuing
:fg
sh -c 'n=1; while [ $n -lt 10 ]; do echo $n; sleep 1; let n=n+1; done'
6
7
8
9
:exit
exit