スクリプトを実行しています(編集できません)。はい/いいえの質問が3つあります。これらの質問に自動的に回答するにはどうすればよいですか?はい、はい、いいえ(この順序で)と答える必要があります。
これを試して:
echo -e "yes\nyes\nno" | /path/to/your/script
help echo
から:
-e
:次のバックスラッシュエスケープの解釈を有効にします
一部のスクリプトは、標準入力から応答を受け取ることができます。これを行う多くの方法の1つは次のとおりです。
$ printf "%s\n" yes yes no | ./foo.sh
yes yes no
これはシンプルで読みやすいですが、スクリプトの内部が標準入力をどのように処理するかに依存しており、ターゲットスクリプトを編集できない場合に問題となることがあります。
標準入力の使用を回避できることもありますが、一般的に、対話型プロンプトは Expect などのツールで処理する方が適切です。たとえば、スクリプトfoo.shを指定すると、foo.expそれを自動化します。
注:autoexpectを使用してインタラクティブセッションからスクリプトを作成し、必要に応じて編集することもできます。 Expectを初めて使う人にはこれを強くお勧めします。
これは、自動化したいスクリプトです。
#!/usr/bin/env bash
for question in Foo Bar Baz; do
read -p "${question}? "
replies=("${replies[@]}" "$REPLY")
done
echo "${replies[@]}"
上記のBashスクリプトを自動化する単純なExpectスクリプトを次に示します。 Expectループ、分岐、および正規表現は、この単純化された例が示すよりもはるかに柔軟性を提供できますが、doesは、最小限のExpectスクリプトがいかに簡単かを示しています!
#!/usr/bin/env expect
spawn -noecho /tmp/foo.sh
expect "Foo? " { send -- "1\r" }
expect "Bar? " { send -- "2\r" }
expect "Baz? " { send -- "3\r" }
interact
Expectスクリプトを実行すると、インタラクティブセッションは次のようになります。それはあなたのBashスクリプトを生成し、それぞれの異なるプロンプトに指示通りに応答します。
$ /tmp/foo.exp
Foo? 1
Bar? 2
Baz? 3
1 2 3