私は対話型スクリプトを自動化するための3つのオプションを理解しています。
- 実行可能ファイルへの応答をパイプします。
yes '\n\n\n\n\nY\n' | ./script
yes
Command は、すべての質問に対して同じ応答を提供します。expect
明確な回答を提供
私が経験している状況は次のとおりです。
多くの質問をするスクリプトがあります。実際、質問の数はスクリプトのバージョンによって異なります。最後の質問は、以前のすべての回答のYes / Noチェックです。
各質問にはリストから選択する必要があります。最後の質問を除くすべての質問には基本的な答えがあります。したがって、Enterキーを押してデフォルト値を適用できます。
私がしたいこと:
スクリプトを実行するときは、すべての質問に対してデフォルト値を受け入れ、最後の質問には「Y」を選択します。
上記のオプションが利用できないのはなぜですか?
- パイプライン - 問題の数はスクリプトのバージョンによって異なります。
yes
コマンド - これは、はい/いいえの最後の質問を説明しません。expect
コマンド - 質問の数はさまざまです。 Expectがこの問題を処理できるかどうかはわかりません。
以下は小さなサンプルです。
Installation Choice for Product A
********************************************************
0. Do not install Product A
1. Install Product A Version - 1.0.1.7
2. Install Product A Version - 1.1.4.8
ANSWER [0]: *Press Enter*
Installation Choice for Product B
********************************************************
0. Do not install Product B
1. Install Product B Version - 10.0.1.4239.03
2. Install Product B Version - 10.0.1.4239.04
ANSWER [2]: *Press Enter*
The package versions below have been selected for installation?
Product A Do not install
Product B 10.0.1.4239.04
Cancel=N, Download and Install=Y [Y/N] *Type 'Y' and press Enter*
質問ごとに基本的な回答が異なるため、「デフォルト」を使用する以外に正解が何であるかさえわかりません。
最終警告:実行したいスクリプトを編集できません。
ベストアンサー1
予想されるスクリプトは次のとおりです。
#!/usr/bin/expect
exp_internal 1 ; # remove this when you're done testing.
spawn /path/to/your/program
set timeout -1
expect {
-re {ANSWER \[\d+\]: $} {
send "\r"
exp_continue
}
{Cancel=N, Download and Install=Y} {
send "Y\r"
}
}
expect eof
秘密の要素は、exp_continue
基本的にコマンドの一番上に「ループ」して、与えられたexpect
パターンの1つと再一致できるようにすることです。