我正在编写一个小脚本,以尝试在缺少 par 时自动在系统上安装 pear-基本上,采用安装过程的交互部分并使它们非交互式,所以我需要做的就是执行脚本,它自己为我完成。这是我第一次尝试使用 expect,这不是我所期望的。
示例代码如下:
/usr/bin/expect <<EOD
set timeout 20
set number [lindex $argv 0]
set path [lindex $argv 1]
spawn php -q go-pear.phar
expect "1-11, 'all' or Enter to continue:"
send "$numberr"
interact
expect "Installation base ($prefix) [/usr/local] :"
send "$pathr"
interact
EOD
这目前还不太有效,因为它试图在第一个菜单中填写/usr/local 部分,如下所示:
1-11, 'all' or Enter to continue: invalid command name "/usr/local"
while executing
"/usr/local"
invoked from within
"expect "Installation base () [/usr/local] :""
谁能告诉我我在这里错过了什么?另外,我想得到这个,这样我就不必将其作为 ./script $var 0 $var 1 运行,而只是将其作为 ./script 运行,其中包含所有内容并填写,但不确定如何做到这一点。
提前感谢您提供的任何帮助。
一个问题是字符串中的[...]
告诉期望执行命令。我认为你需要用[...]
逃离他们.
希望这有所帮助=)
我最终弄清楚了这一点。如果其他人想做类似的事情,以下是对我有用的方法:
/usr/bin/expect <<EOF
set send_slow {1 .1}
set timeout -1
spawn php -q go-pear.phar
expect "1-11, 'all' or Enter to continue:"
sleep .1
send -s -- "1r"
expect -exact "1r"
sleep .1
send -s -- "/usr/localr"
expect -exact "/usr/localr"
expect "1-11, 'all' or Enter to continue:"
sleep .1
send -s -- "r"
expect -exact "r"
expect EOF