コマンドを生成し、一連のイベントを待機するexpectスクリプトについて考えてみます。これを使用してソフトウェアをテストします。タイムアウトが発生したときに、スクリプトから常に失敗の戻り値を取得しようとしています。
spawn some-command
set timeout 10
expect "First message"
expect "Other message"
このスクリプトは、タイムアウトが発生した場合でも、常に0(成功)を返します。タイムアウトを処理する唯一の方法は、すべてのexpectステートメントを次のように変換することです。
expect {
timeout { exit 1 }
eof { exit 1 }
"First message"
}
しかし、これはすぐに扱いにくくなります。簡略化はありますか?早期タイムアウト/ eof致命的エラーを引き起こすexpectオプションはありますか?
コメント meuhの答え 、expect_before
はexpect
と同じ引数を取るので、次のように書くことができます。
expect_before {
timeout { puts "timeout"; exit 2 }
eof { puts "eof"; exit 1 }
}
# ...
expect "First message"
expect_before
コマンドを設定できます。これは、スクリプトの後半でexpect
を使用するたびに実行されます。例えば
proc abort { } { send_user "Timeout!" ; exit 2 }
set timeout 5
spawn ssh myhost
expect_before timeout abort
expect "assword: "
send "abc\r"
expect "$ "
send "sleep 99\r"
expect "$ "