web-dev-qa-db-ja.com

Linux Bashスクリプトのプロンプトに自動的に応答するにはどうすればよいですか?

スクリプトを実行しています(編集できません)。はい/いいえの質問が3つあります。これらの質問に自動的に回答するにはどうすればよいですか?はい、はい、いいえ(この順序で)と答える必要があります。

9
Ron

これを試して:

echo -e "yes\nyes\nno" | /path/to/your/script

help echoから:

-e:次のバックスラッシュエスケープの解釈を有効にします

13
Cyrus

標準入力へのパイプ

一部のスクリプトは、標準入力から応答を受け取ることができます。これを行う多くの方法の1つは次のとおりです。

$ printf "%s\n" yes yes no | ./foo.sh 
yes yes no

これはシンプルで読みやすいですが、スクリプトの内部が標準入力をどのように処理するかに依存しており、ターゲットスクリプトを編集できない場合に問題となることがあります。

対話型プロンプトにExpectを使用する

標準入力の使用を回避できることもありますが、一般的に、対話型プロンプトは Expect などのツールで処理する方が適切です。たとえば、スクリプトfoo.shを指定すると、foo.expそれを自動化します。

注:autoexpectを使用してインタラクティブセッションからスクリプトを作成し、必要に応じて編集することもできます。 Expectを初めて使う人にはこれを強くお勧めします。

Bashスクリプト:foo.sh

これは、自動化したいスクリプトです。

#!/usr/bin/env bash
for question in Foo Bar Baz; do
    read -p "${question}? "
    replies=("${replies[@]}" "$REPLY")
done
echo "${replies[@]}"

期待スクリプト:foo.exp

上記の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
10
Todd A. Jacobs