2016-05-18 51 views
4

対話型コマンドラインJavaプログラムをbashで自動化して、入力に対して適切な出力が得られることを検証しています。私は自分のフルネームを入力するようにユーザに要求したJavaプログラムを持っている、とだけ彼らの最初の名前を出力した場合bashによる対話型プログラムの出力と入力のキャプチャ

例えば、それは次のようになります。

Enter your name: John Doe 
John 

どこに「ジョン・ドウ」ユーザーが入力したものです。

これは次のようになります実行するための簡単なbashコマンド:

OUTPUT=`echo "John Doe" | java NameReader` 

または

OUTPUT=`java NameReader <<< "John Doe"` 

これらの両方とのトラブルが$ OUTPUTは現在、以下が含まれていることである。

Enter your name: John 

stdin(およびそれに付随する改行)に送信されたテキストがoutpで再現されないため私たちがコンソールに表示する方法でプログラムを実行します。

Enter your name: John Doe 
John 

しかし、私はこれと一緒に暮らすことができます::理想的

、$出力はこれを含んでいるでしょう

Enter your name: 
John 

(入力が完全に省略されていますが、出力のように、新しい行にあります予期しない)

bash(基本となるjavaプログラムを変更することなく)で、stdinにパイプされるテキストを取得して、javaプロによって読み込まれる「時刻」にstdoutにパイプする方法はありますかグラムなので、完全なインタラクティブなセッションがキャプチャされますか?

(もう一つ注意:一部の産卵は/コマンドが役に立つかもしれません期待していることを示し、検索、これは上で動作するシステムは、彼らが利用できる持っているように見えません)

+0

だから 'echo" John Doeと言うとき、コンソールで何を見ますか? Java NameReader'(バッククッキーなし)? –

+0

@ n.m。同じ結果が表示されます。「あなたの名前を入力してください:John」(すべて1行で) – jthurman

+0

あなたのスクリプトはあなたに何かを提示しますが、改行を挿入する場所を知る方法は? –

答えて

1

Javaプログラムは次のようである場合:

import java.util.Scanner; 
class A { 
     public static void main(String[] args) { 
       Scanner sc = new Scanner(System.in); 
       System.out.println(sc.next()); 
     } 
} 

その後、あなたは

にそれを変換するために、フォーム

Enter your name: John 
John Doe 

の入力を解析しますbashスクリプトを構築できますここで

Enter your name: John Doe 
John 

一つの可能​​なbashスクリプトは次のとおりです。pipeCheat.bashはあなたが上記のスクリプトを保存したファイルの名前です

bash pipeCheat.bash 'echo "john doe"' 'java A' 

#!/bin/bash 
arg1Outpt=`eval "$1"` 
javaOut=`echo "$arg1Outpt" | eval "$2"` 
#prints Enter your name: John\nJohn Doe  
echo "${javaOut}"$'\n'"${arg1Outpt}" | 
         sed 'N; s/\(Enter your name: \)\(.*\)\(\n\)\(.*\)/\1\4\3\2/' 
         #and this is a multiline sed(man sed) that transforms your 
         #input into what you want :) 

はこのようにそれを使用しています。

ご不明な点がございましたら、お気軽にお問い合わせください。

2

あなたはこれがlog.txtファイルにjava NameReaderコマンドの入力と出力に含まを記録します

script -q -c "java NameReader" log.txt 

scriptのコマンドを使用することができます。

0

ここで私は何をしたのですか。それは完全なソリューションではありませんが、それはこのケースで動作し、以降の似たような直面し、他の誰かに役に立つことがあります。これは、並列に2つのことを行うためのスクリプトを引き起こし

{ sleep 3; echo "John Doe" | tee -a out.txt; } | java NameReader >> out.txt 
OUTPUT=`cat out.txt` 
rm out.txt 

  1. 待ちを3次に、パイプとファイルの両方にテキスト "John Doe"を書き出します。
  2. Javaプログラムを実行します。

teeを使用すると、テキストはパイプ(Javaプログラムが読み込みを待っている)とファイルの両方に書き込まれます。 -aオプションは、ファイルを上書きするのではなく、ファイルに追加します。

javaプログラムは、内容をout.txt(>>を使用)に追加します。

次に、ファイルの内容をOUTPUT変数に読み込み、ファイルを削除します。

それは限り、Javaプログラムが実行され、3秒睡眠中にユーザーの入力を待っているように動作...

  1. ので、これは、実際には完全なソリューションではありません。そうでない場合、出力は文字化けします。プログラムが3秒後に入力待ちになるのは合理的ですが(この場合)、確かに保証されません。
  2. 3秒の遅延は、プロセスを必要以上に遅くします。 javaプログラムが1秒後に入力準備が整った場合、何もしないで2秒余分に費やしています。これが何度も実行されると、それが足りる可能性があります。
  3. これは、1つの入力を受け取る対話型プログラムにのみ実際に適用できます。複数の回線に応答するためにスリープ長の異なる複数の「スリープ/エコー/ティー」構成を使用することは可能かもしれませんが、非常に迅速かつ複雑になるようです。

...これは私が今までに得た最高のものです。もちろん、より良いソリューションが依然として求められています。

関連する問題