2014-11-18 2 views
0

Я использую сценарий expect для установки некоторых пакетов. Во время таких установок иногда запрашивает разрешения: Y/n, чтобы установить их, а иногда нет.Как продолжить, если ожидаемая строка не отображается?

У меня 2 вопроса:

1) Как заботиться о обоих этих случаях?

#!/usr/bin/expect -- 
# This is for boto libraries installation 
spawn apt-get install python-pip 
expect { 
    "Do you want to continue" 
     { send "Y\r\n" ## HERE SOMETIMES THIS STRING MAY NOT APPEAR 
     } 
} 
interact 
spawn pip install filechunkio 
interact 
spawn pip install -U boto 
interact 

Когда ожидаемая строка не появляется, он выдает сообщение об ошибке, как

spawn_id: spawn id exp6 not open 
    while executing 
"interact" 
    (file "./botoInstall.exp" line 10) 

линии 10 является первым взаимодействуют.

2) Здесь что означает spawn_id: spawn id exp6 not open?

+0

Проходит ли '-y'' apt-get' не делать то, что вы хотите здесь, без всего этого беспорядка? По крайней мере, для шага 'apt-get'. –

+0

За 1) см. Ответ Динеша. Для 2) это потому, что ожидаемая строка не отображалась, поэтому команда 'expect' возвращалась только на' timeout' или 'eof'. Так как команда 'apt-get' обычно заканчивается очень быстро (<10 с), поэтому команда' expect' увидит 'eof', что означает, что порожденный процесс' apt-get' уже вышел, поэтому команда 'interactive' определенно завершится неудачей , – pynexj

ответ

0

Вы должны использовать exp_continue, чтобы иметь необязательную строку в expect, чтобы дождаться ее. Выше сценарий может быть изменен, как

spawn apt-get install python-pip 

expect { 
    "Do you want to continue" { send "Y\r\n"; exp_contine } 
    #some other expect string along with 'exp_continue' 
    timeout { puts "timeout happened" } 
    eof { #some other action here# } 
} 

Если expect видит эти слова, он будет посылать y\r\n, иначе это будет продолжаться, чтобы проверить для других строк.

Помните о наличии некоторых критериев выхода в exp_continue. Иначе, очевидно, что тайм-аут произойдет, если ни один из них не будет замечен в течение срока.

Что касается вашего запроса на spawn id exp6 not open, взгляните на here и here.

+0

Я не уверен, что 'exp_continue' является важной деталью здесь. Я думаю, что тайм-аут. Хотя вам нужно 'exp_continue', если в этом же блоке есть другие строки. –

Смежные вопросы