#tcl #expect
Вопрос:
У меня есть следующий сценарий ожидания.
Это test.exp
#!/usr/bin/expect
# exp_internal 1
# log_file -noappend ~/expect.log
# Use `send_log` to print to log file
set timeout 30
set bold [exec tput bold]
set red [exec tput setaf 1]
set green [exec tput setaf 2]
set normal [exec tput sgr0]
proc test_label {value} {
upvar bold bold
upvar normal normal
puts "Running ${bold}${value}${normal}…"
}
proc test_send {value} {
sleep 0.1
send "$value"
}
proc test_failed {} {
upvar bold bold
upvar red red
upvar normal normal
sleep 0.1
puts "${bold}${red}Failed${normal}"
exit 1
}
proc test_ok {{force_close false}} {
upvar bold bold
upvar green green
upvar normal normal
sleep 0.1
puts "${bold}${green}OK${normal}"
if {$force_close} {
close
}
}
expect_before {
default {
test_failed
}
}
Это electrum.exp
#!/usr/bin/expect
source ./test.exp
test_label "Should create Electrum mnemonic"
spawn qr-backup.sh --create-electrum-mnemonic
expect {
-re {Format USB flash drive (y or n)?} {
test_send "nr"
}
}
expect {
-re {[sudo] password for pi:} {
test_send "$env(password)r"
}
}
expect {
-re {Creating Electrum mnemonic…}
}
expect {
-re {([a-z] ?){24}} {
test_ok true
}
}
Почему сценарий не завершается ошибкой, когда последняя строка, возвращенная spawn qr-backup.sh --create-electrum-mnemonic
is electrum: error: unrecognized arguments: --nbits 264
?
Ответ №1:
Понял это!
Решается с помощью eof
оператора.
expect {
-re {([a-z] ?){24}} {
test_ok true
}
eof {
test_failed
}
}
Комментарии:
1. Если вы хотите сделать то же самое во многих местах, рассмотрите возможность использования
expect_after { eof { test_failed }}
2. Спасибо за предупреждение @DonalFellows!
3.
default
Узор покрываетeof
. Гленн Джекман объясняет истинную причину, по которой код не работает. Заменаexpect_before {default {test_failed}}
наexpect_after {eof {test_failed}}
не будет иметь никакого значения.
Ответ №2:
Обратите внимание на это со страницы руководства «Ожидать»:
expect_before [expect_args]
Если не переопределено
-i
флагом,expect_before
шаблоны совпадают с идентификатором порождения, определенным во время выполненияexpect_before
команды (не тогда, когда его шаблон совпадает).
(выделено мной)
При выполнении команды идентификатор порождения не был активен expect_before
.