Bash / expect脚本来控制执行

时间:2015-09-25 14:04:56

标签: linux bash shell expect execution

我希望使用bash脚本来控制已编译的C程序X的执行流程。程序X只生成文本输出,我希望在打印某个字符串时立即暂停执行。在此之后,我想切换到bash并执行一些命令然后返回到完成X.我已经完成了一些阅读和测试,并且只期望/ bash脚本似乎满足了我的需求。但是,我在实现目标方面遇到了困难。

我已尝试在期望脚本中生成X ,然后期望“mystring”,然后发送 bash脚本命令,但这只会导致X终止后执行bash命令。

有谁知道实现这一目标的方法?为了澄清,我不能在这种情况下使用gdb。

#!/usr/bin/expect
spawn X
expect "mystring"
send -- "bash command"

1 个答案:

答案 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