我写了一个expect
脚本,如下所示:
#!/usr/bin/expect -f
spawn sql "user=xx dbname=xx"
interact
在我进入sql
客户端后,我无法通过ctrl + z
发送SIGTSTP信号来使当前进程挂起并转到后台。
终端将只显示:
=> ^Z
我应该怎么做才能使ctrl + z
达到上述目的?
expect
的手册给出了配方:
在交互过程中,使用原始模式,以便所有字符都可以传递到当前进程。如果当前进程没有捕获作业控制信号,则如果发送停止信号(默认情况下为^Z(,它将停止。要重新启动它,发送一个继续信号(例如通过"kill-CONT"(。如果您真的想(通过^Z(向这样的进程发送SIGSTOP,请考虑先生成csh,然后运行程序。另一方面,如果您想向Expect本身发送SIGSTOP,请首先调用解释器(可能使用转义符(,然后按^Z。
因此,您可以执行以下操作:
#!/usr/bin/expect -f
spawn /bin/sh
exp_send "psql hostaddr=xxxx port=xxxx user=xx dbname=xxr"
interact
例如,让我们考虑以下名为interact.sh
:的交互式shell脚本
#!/bin/sh
read -p "First name: " fname
read -p "Last name: " lname
echo "you entered: $fname $lname"
下面期望名为script.exp
的脚本自动执行上一个脚本:
#!/usr/bin/expect -f
spawn /bin/sh
exp_send "./interact.shr"
interact
我们推出了后者:
$ ./script.exp
spawn /bin/sh
./interact.sh
$ ./interact.sh
First name: Stack
Last name: ^Z (we entered CTRL-Z here)
[1]+ Stopped(SIGTSTP) ./interact.sh
sh-4.4$ jobs
[1]+ Stopped(SIGTSTP) ./interact.sh
sh-4.4$ fg
./interact.sh
Overflow
you entered: Stack Overflow
$ exit
exit
$