0

我正在编写一个小脚本来尝试在系统上自动安装 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 "$number\r"
interact
 expect "Installation base ($prefix) [/usr/local] :"
send "$path\r"
 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 $var0 $var1 运行,而只需将它作为 ./script 运行,其中包含并填写所有内容,但不知道该怎么做那。

提前感谢您提供的任何帮助。

4

2 回答 2

3

一个问题是[...]字符串内部告诉期望执行一个命令。我认为你需要用\[...\].

希望这会有所帮助=)

于 2012-10-12T17:06:46.047 回答
1

我最终弄清楚了这一点。如果其他人想做类似的事情,这对我有用:

 /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 -- "1\r"
 expect -exact "1\r"
   sleep .1
 send -s -- "/usr/local\r"
 expect -exact "/usr/local\r"
 expect "1-11, 'all' or Enter to continue:"
   sleep .1
 send -s -- "\r"
 expect -exact "\r"
 expect EOF
于 2012-10-12T17:01:23.967 回答