GNU/Linux >> Linux の 問題 >  >> Linux

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

これを試してください:

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 を使用する

標準入力を使用して回避できる場合もありますが、対話型のプロンプトは一般に、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[@]}"

Expect スクリプト:foo.exp

上記の Bash スクリプトを自動化する単純な Expect スクリプトを次に示します。ループ、分岐、および正規表現を期待すると、この非常に単純化された例が示すよりもはるかに柔軟になりますが、実際に 最小限の 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

Linux
  1. Linuxコマンドのスクリプトを作成する方法

  2. LinuxのbashコマンドをPERLスクリプトで実行する方法は?

  3. LinuxでBashプロンプトを短縮する方法は?

  1. Bashスクリプトをデバッグする方法は?

  2. BashスクリプトにUnix/Linuxユーザーを追加する方法は?

  3. Bashスクリプトで文字列を分割する方法

  1. LinuxでPerlスクリプトをシステムデーモンとして実行するにはどうすればよいですか?

  2. 古いバージョンの Bash で Bash スクリプトをテストするにはどうすればよいですか?

  3. Bash スクリプトでホスト名を IP アドレスに解決するにはどうすればよいですか?