生成新进程并 Return 期待脚本

Spawn New Process and Return to Expect Script

我正在使用 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

不需要自动与该脚本进行任何交互,所以不要使用 spawn

exec db_edit.sh

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