2009-09-28 19 views
5

私は、コマンドラインから起動すると標準入力から読み込むプログラムを持っています。通常、ユーザは何らかの情報を入力し、新しい行でC-dを押してファイルの終わりを知らせると、プログラムはファイルを処理します。その後、ユーザは再びプロンプトを表示し、さらにテキストを入力し、C-dを押して2番目のファイルの終わりを知らせます。標準入力からシェルスクリプトから複数のファイルを送信する

私は、このプログラムを起動して2つのファイルを自動的に提出するシェルスクリプトを書こうとしています。

$ myprogram < file1.txt < file2.txt 

OR

$ myprogam <file1.txt file2.txt 

任意の提案:私はこのような何かをしたいですか?私はLinux上でbashシェルを使用しています。

+0

ユーザーはどのようにすべてのファイルの終了を示しますか? 2つの制御Dが連続していますか? Unixプログラムの標準的な設計は、 "コマンドラインで指定されたファイルを読み込みます;そのようなファイルがない場合は、標準入力を処理します"。そのデザインを採用すれば、問題はありません。 'myprogram file1.txt file2.txt'を起動するだけです。 –

答えて

0

おそらく、expectを使用することです。

3

明らかにあなたがプログラムの標準入力に2つのファイルを送信するためにcatを使用することができますが、これはあなたが望むもの、おそらくではありません。上記の場合myprogram

$ cat file1.txt file2.txt | myprogram 

file1.txt端を伝えることができないだろう特定の書式設定をしておらず、ファイルの終わりまたは先頭を示す特定の書式設定でストリームを監視していない限り、file2.txtが開始されます。

複数のストリームを標準入力に送る標準的な方法はありません。本質的には、単一のストリームが標準入力に入ります。

スクリプトを構築して、コマンドラインで複数の引数を受け入れ、一度に1つずつ内部的に開き、処理するようにします。つまり、あなたがそうのようにそれを呼び出します。

$ myprogram file1.txt file2.txt 
+0

たぶん、言い方があります: $ cat file1.txt "EOF" file2.txt それからそれは2つの別々のファイルだと分かりますか? –

+0

いいえ、そういうEOFを送る方法はありません。 Pavel Shvedの答えに対する私のコメントを見てください。 –

0

ジョナサン・レフラーは私の解決策は誤っていることを、彼のコメントで述べています。たぶんそうです。私は実際にそれを完全にチェックしていない。しかし、それが間違った答えであるという情報のために、ここに来てください。


Bashは、echoコマンドで制御文字をエコーバックできます。 EOFは、すでに述べてきたように、C-dあり、それでは、サブシェルを使用してみましょう:それは別のプログラムであるかのように

$ (cat file1.txt ; echo -e '\cD' ; cat file2.txt) | myprogram 

これは括弧とパイプ内でそれらのすべての出力をコマンドを実行します。

あなたはそれパイプ正しくその不確かな場合は、これを試してみてください。

$ (echo "Hello" ; echo -e '\cD' ; echo "bash") | tee 
+1

control-Dはターミナル・ドライバによってインターセプトされ、保留中のデータがあれば送信します。したがって、プログラムはEOFを示す0バイトの読み込みを取得します。リテラルのcontrol-D文字をパイプラインの下にエコーすることは、これをシミュレートしません - 支援するターミナルドライバはありません。それは 'expect'が来るところです - 端末をエミュレートするために擬似ttysを使います。 –

2

それは1回の呼び出しでなければなりませんか?そうでない場合:

for file in file1 file2 file3; do myprogram < $file; done 
0

あなたが説明するプログラムの動作をシミュレートするためのシンプルなPythonプログラムを作成しました。ごくわずかでは、プログラムの仕組みを想定するのではなく、同じことを話す立場にいます。 (もちろん、あなたのプログラムが実際に私がここでそれを説明している方法で動作しない場合は、私を修正してください。)

#!/usr/bin/python 

def read_a_file(): 
    print('Type the contents of a file now.') 
    while True: 
     try: 
      s = raw_input('>') 
     except EOFError: 
      break 

read_a_file() 
read_a_file() 
print('We have now read two files. Quitting.') 

あなたは、このスクリプトを実行する最初のファイルの内容を入力し、CTRL-Dを打つ、二番目のファイルの内容を入力し、CTRL-Dを押すと、プログラムが終了することができます。これはあなたが記述している動作のようです。

私の最初の考えは、カオスが示唆しているように、期待を使用することでした。しかし、私は、ファイルの内容をプロセスにパイプすることを期待してサポートを見つけることはできません。 (私はファイルの内容が毎回異なっていると仮定します。もしそれらが同じであれば、expectのスクリプトにファイルの内容を入れるだけで動作します)

私は注意すべきです決して期待の専門家ではない。私には分かりませんが、これを行う方法があるかもしれません。

あなたのプログラムを起動したPythonスクリプトを書いて、ファイルとEOF文字の内容を入力しました。しかし、Jonathan Lefflerのコメントでは、EOF文字がエコーされないと思っていました。

私の3番目の考えはかなりクルージュです。 expectスクリプトにファイルの内容をプラグインし、expectスクリプトを実行することによって、expectスクリプトを作成するスクリプトを作成できます。私はそれがうまくいくと思う。

関連する問題