我使用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
后恢复安装脚本?
答案 0 :(得分:2)
无需自动执行与该脚本的任何交互,因此请勿使用spawn
exec db_edit.sh
这样,您就不会干扰当前生成的进程的spawn_id。