产生新过程并返回到期望脚本

时间:2016-07-22 17:18:52

标签: bash shell expect spawn

我使用Expect脚本自动安装程序。由于其中一个安装依赖项存在问题,我需要在特定点暂停安装过程以编辑db.properties文件。一旦该文件被更改,我就可以恢复安装过程。我可以在安装过程中生成一个新进程来执行此操作,但在关闭该进程后,我得到“spawn id exp5 not open”错误。

db_edit.sh编辑了相应的文件:

#!/usr/bin/sh
filename=db.properties
sed -i "s/<some_regex>/<new_db_info>/g" $filename

我的自动安装脚本在执行过程中产生上述脚本:

#!/usr/bin/expect

# Run the installer and log the output
spawn ./install.bin
log_file install_output.log

# Answer installer questions
# for simplicity, let's pretend there is only one
expect "PRESS <ENTER> TO CONTINUE:"
send "\r"

# Now I need to pause the installation and edit that file
spawn ./db_edit.sh
set db_edit_ID $spawn_id
close -i $db_edit_ID
send_log "DONE"

# Database Connection - the following must happen AFTER the db_edit script runs
expect "Hostname (Default: ):"
send "my_host.com\r"
# more connection info ...

expect eof

输出日志install_output.log显示以下错误:

PRESS <ENTER> TO CONTINUE: spawn ./db_edit.sh^M
DONEexpect: spawn id exp5 not open
    while executing
"expect "Hostname (Default: ):""^M

数据库信息已被正确修改,因此我知道该脚本有效并且确实已经生成。但是,当我关闭该进程时,安装过程的spawn id也显然已关闭,这会导致spawn id exp5 not open错误。

同样奇怪的是,产卵似乎应该发生。对"PRESS <ENTER>"的回复应为"\r"^M,表示已发送ENTER

如何解决这个问题,以便在关闭db_edit.sh后恢复安装脚本?

1 个答案:

答案 0 :(得分:2)

无需自动执行与该脚本的任何交互,因此请勿使用spawn

exec db_edit.sh

这样,您就不会干扰当前生成的进程的spawn_id。