2011-07-01 13 views
3

私はかなり新しいです。私は何をしようとしているのかについてドキュメントのためにinterwebsを探しています。私は運がない。Perlでの期待とファイルへのパイプ

私は全体を通してプロンプトを表示して情報をstdoutに出力するプログラムを持っています。その情報をファイルにパイプするPerlスクリプトを作成する必要があります。

私はExpectを使うことができると思っていましたが、最初のプロンプトの後にパイプに問題があるようです。ここで

は、私のコードの一部です:

# Run program and compare the output to the BASE file 
$cmd = "./program arg1 arg2 arg3 arg4 > $outfile"; 

my $exp = new Expect; 
$exp->spawn($cmd); 
BAIL_OUT("couldn't create expect object") if (! defined $exp); 

$exp->expect(2); 
$exp->send("\n"); 

この場合は、「入力」を押すために、ユーザのための唯一のプロンプトがあります。このプログラムは小さく、非常に高速です.2秒は最初のプロンプトに到達するのに十分な時間です。

出力ファイルには、情報の前半部分のみが含まれています。

誰も私が後半をどのように捉えることができるかについての提案はありますか?

UPDATE:「<戻る>」Perlスクリプトを探しできることを冗長な表現である

spawn ./program arg1 arg2 arg3 arg4 
expect "<Return>" 
send "\r" 
interact 

: 私は、これは簡単なスクリプトを使用して期待して動作することを確認しました。

注:「< Return」と期待するためにPerlスクリプトを作成しようとしました。「...違いはありません。

すなわち

$exp->expect(2, '-re', "<Return>") 

任意の考え?

更新日2:

ハザ!私は私の問題に対する解決策を見つけました...偶然、完全に。

だから、私は私が作ったいくつかのテストコードで間違えた...

末尾が期待
$exp->expect(2); 
$exp->send("\r"); 
$exp->expect(2); 

注(2)...私は偶然で、それが働いたことを左に持っていました!

私は何が起こっているのか理解しようとしています。 Unixの期待はこのようには見えません! Perlで実装されているExpectは何かを予期しています...プロンプトだけではありませんか?

私はstdoutを収集するために別の2秒を期待して、私はすべてを得ることができます。

誰かがここで何が起こっているかについてより詳細な情報を提供できる人は、何が起こっているのか理解したいと思います。私が期待し使用していたので、

+1

Expectを使用する必要がありますか?それは、特にperlを初めて使う人にとって、過剰なもののようです。 – TLP

+0

他の提案はありますか?私はこの1つの質問以外には複雑すぎるようなものに遭遇していません。 – Rico

答えて

4

\nの代わりに\rを送信してみてください - 改行ではなく改行をエミュレートしようとしていますが、tty設定では翻訳されていない可能性があります。 ALSO

おそらくあなたの偶然のソリューションを与えているようだ期待ドキュメントのFAQセクションからの提案:

私のスクリプトは、任意の明白な理由なく随時失敗しました。それは 私は時々産まれたプログラムからの出力を失っているようです。

スポーンされたプログラムに完了するのに十分な時間を与えることなく、非常に早く終了することができます。 プログラムを正常に終了するには$ exp-> soft_close()を追加するか、 "eof"の場合はexpect()を実行してください。

また、プログラムを作成()した後に「スリープ1」を追加してみてください。 あなたのシステム上のptyの作成はちょっと遅いかもしれませんが(最新のIO-Ttyを使用している場合はこれはむしろ ではありません)

標準のunix/tcl expectは、対話モードで終了しないため、プログラムの実行時間を十分に延ばすことができます。

+0

提案していただきありがとうございますが、 '\ r'はそのトリックを行いません。私がこの問題を最初に投稿したとき、私はそれを試みたとは思うが確信が持てない。 – Rico

+0

「プログラム」がプロンプトを出して入力を読み取る方法を知っていますか?あなたのスクリプトの下で実行されたときだけそれはぶら下がっていますか?あなたは、キーストロークをどのように読み取ろうとしているのかを見るために、プログラムを 'strace 'することによって何が起こっているのかをもう少し診断することができます。 –

+0

私はそこにインターフェイスを書いています。次のコードを使用しています:std :: cin.clear(); std :: cin.ignore(std :: numeric_limits :: max()、 '\ n'); – Rico

1

それはしばらくしているが、私は反対プロンプトを一致させることを期待するために何かを提供する必要が確信している:例えば

$exp->expect(2, 'Press enter'); 

+0

マッチは必須ではありません。オプションです。それを放置することによって、2秒待ってから続行することが期待されます。 – Rico