期望:提示延伸到下一行

时间:2015-07-10 05:34:24

标签: shell expect

我正在尝试安装一个shell脚本文件的软件。我正在使用 expect 进行静默安装。

在软件安装过程中有一条奇怪的行,提示符如下所示进入下一行。

ENTER AN ABSOLUTE PATH, OR PRESS <ENTER> TO ACCEPT THE DEFAULT 
  :

所以我尝试了这两个选项,但它不起作用!

1. expect  "    : " { send "/home/tester/IDir\r" }
2. expect "ENTER AN ABSOLUTE PATH, OR PRESS <ENTER> TO ACCEPT THE DEFAULT\
      : " { send "/home/tester/IDir\r" }

期待文件

#!/usr/bin/expect -f
#Taking arguments from test.sh file

set File [lindex $argv 0]
set IDir [lindex $argv 1]
spawn sh /home/tester/$File 
expect "PRESS <ENTER> TO CONTINUE: " { send "\n" }
exp_internal 1
expect -re "TO ACCEPT THE DEFAULT\r\n.*?:" { send "/home/tester/IDir\r" }
#expect "      : " { send "/home/tester/IDir\r" }
expect "IS THIS CORRECT? (Y/N): " { send "Y\n" }
expect "PRESS <ENTER> TO CONTINUE: " { send "\n" }
sleep 2
expect "ENTER THE NUMBER OF THE DESIRED CHOICE: " { send "2\n" }
expect "PRESS <ENTER> TO EXIT THE INSTALLER: " { send "\n" }
sleep 2
expect eof

test.sh文件

dir=James/SDD
cd /home/tester
file=`ls | grep xx_yy*_linux_x86-64.bin`
expect script.exp $file $dir

1 个答案:

答案 0 :(得分:0)

在分析日志后,意识到您的expect代码在大多数情况下都会超时。

# This timeout is meant for the first expect word 'PRESS <ENTER> TO CONTINUE', so it is proceeding to the next expect word 'TO ACCEPT THE DEFAULT.*?:' 
expect: timed out
Gate keeper glob pattern for 'TO ACCEPT THE DEFAULT
.*?: ' is 'TO ACCEPT THE DEFAULT

您需要为expect语句添加正确的超时处理。默认超时为10秒。您可以按照以下方式更改它,

set timeout 120; # Now, timeout value is 2 min

我可以看到你在某些地方使用了sleep,同样也为早期的expect命令做了。 (在这种情况下,使用timeout会比睡觉更好。)

#Taking arguments from test.sh file
set File [lindex $argv 0]
set IDir [lindex $argv 1]

# A common handler for timeout. 
# Customize it as per your need.
proc my_timeout_handler {} {
    puts "Timeout happened :("
    exit 1
}

spawn sh /home/tester/$File 
set timeout 300; # 5 mins.
expect {
    "PRESS <ENTER> TO CONTINUE: " { send "\n" }
    timeout {my_timeout_handler}
}
expect {
    -re "TO ACCEPT THE DEFAULT\r\n.*?:" { send "/home/tester/IDir\r" }
    timeout {my_timeout_handler}
}    
expect {
    "IS THIS CORRECT? (Y/N): " { send "Y\r" }
    timeout {my_timeout_handler}
}
expect {
    "PRESS <ENTER> TO CONTINUE: " { send "\r" }
    timeout {my_timeout_handler}
}
expect {
    "ENTER THE NUMBER OF THE DESIRED CHOICE: " { send "2\r" }
    timeout {my_timeout_handler}
}
expect {
    "PRESS <ENTER> TO EXIT THE INSTALLER: " { send "\r" }
    timeout {my_timeout_handler}
}
expect {
    eof {puts "Program completed"}
    timeout {my_timeout_handler}
}