Ожидайте, что вы не потерпите неудачу в eof

#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 .