2013-01-18 12 views
52

私はreadコマンドを使用してコマンドに対話的に引数を読み込むbashスクリプトを持っています。たとえば、yes/noオプションです。デフォルトのオプション値を引数として渡す非対話型スクリプトでこのスクリプトを呼び出す方法はありますか?インタラクティブでないプログラムに対話的に引数を渡す

私は対話型スクリプトに渡す必要があるのは1つのオプションだけではありません。

+2

それは、あなたの入力にパイプ標準入力から –

+2

の可能性が読んでいる場合は、この質問には、多くの重複を取得するとして、対話型プログラムが書かれている言語では問題ないことを指摘する価値があります。これは、標準入力、Erlangアプリケーションなどを読み込むCプログラムです。コマンドラインから実行され、対話的な入力を不快に要求するものがあり、それを自動化したいと考えています。 – tripleee

答えて

22

を使用

your_program << ANSWERS 
yes 
no 
maybe 
ANSWERS 

(これは非常に読みやすいことができる)here documentを使用複雑なタスクはexpecthttp://en.wikipedia.org/wiki/Expect)です。 これは基本的にユーザをシミュレートし、特定のプログラム出力や関連するものにどのように反応するかをスクリプトで記述することができます。

これは、パスワードの配管を禁止するsshなどの場合にも機能します。

+3

... SSHの場合の適切な解決方法は、公開鍵認証に切り替えることです。 – tripleee

11

あなたはファイル内のデータを置くことができ、このようにそれを再指揮:

$ cat data.txt 
2 
3 

スクリプトの実行::

$ file.sh < data.txt 
2 
3 
88

をスクリプトの

$ cat file.sh 
#!/bin/bash 

read x 
read y 
echo $x 
echo $y 

データ多くの方法

パイプy私たちの入力

echo "yes 
no 
maybe" | your_program 

ファイルから

your_program < answers.txt 
をリダイレクト

MORについてはhere string

your_program <<< $'yes\nno\nmaybe\n' 
+2

これは、プログラムが標準入力を読み取る場合にのみ動作することを指摘しています。いくつかのプログラムは途中で読み込みに失敗します。標準入力がパイプの場合でも、対話形式でパスワードを入力できます。パスワードの場合、これはセキュリティの理由から意味があります。いくつかのインタラクティブなプログラムは単に設計が不十分です。 – tripleee

+0

@tripleeeあなたが言ったことの行に沿って、スクリプトはstdinの影響を受けないパスワードをどのように読み取るのですか?私はあなたがstdinをつかむために 'read'を使うことができるのを知っています。その場合 – flow2k

+0

は、あなたがと対話しようとしているプログラムは、(例えばsshpass、ssh-agentの)それに入力を送ったり、スクリプトへの期待の相互作用を使用するための特別な方法を持っているかどうかを確認する必要があります。 –

3

ちょうどもう1つ追加するだけです。それは他の場所で見つけられ、とてもシンプルです。 コマンド "execute_command"のコマンドラインですべてのプロンプトに対してyesを渡したいとします。

yes | execute_command 

これはすべてのyes/noプロンプトに対する答えとしてyesを使用します。

関連する問題