2016-06-13 9 views
1

私は、バッククォートで別のプログラムを呼び出し、特定の文字列の出力をチェックするPerlスクリプトを持っています。これは正常に動作しています。別のプログラムのSTDINと対話するPerlスクリプト

問題は、他のプログラムが何をしているのかに失敗し、ユーザーの入力を待っているときです。ユーザーは、プログラムを終了する前にenterキーを2回押す必要があります。

このプログラムでEnterを2回押すようにPerlスクリプトに指示するにはどうすればよいですか?であなたは可能性がちょうどパイプそれらを

+2

http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod – xxfelixxx

答えて

3

したコマンドがちょうどSTDOUTがスクリプトにパイプされ、スクリプトから同じSTDINとSTDERRを受け始めました。

コマンドを実行する前にSTDINを閉じるだけで、入力ソースがなくてもかまいません。 STDINから読み取るとエラーが発生し、呼び出されたコマンドは終了します。

close STDIN; 
my @slines = `$command`; 

これにより、コンソールへのコンソール入力の可能性もなくなります。

別のアプローチは、あなたのスクリプトが同時にコマンドのSTDINとSTDOUTを制御することを可能にするIPC::Open2を使用します。

use IPC::Open2; 
open2($chld_in, $chld_in, 'some cmd and args'); 
print $chld_in "\n\n"; 
close $chld_in; 
@slines = <$chld_out>; 
close $chld_out; 

このスクリプトは、コマンドによって必要な2つの\nの入力を提供し、コマンド出力を読み込みます。 私:; それはその後になる 私@slines = `" $ command`:

+0

'close STDIN'を使っても、実行中のプログラムの完全な出力をキャプチャすることができませんでした。私はあなたのコードに誤植があると仮定しています - それは 'open2($ chld_out、$ chld_in、 'いくつかのcmdとargs'); しかし、私はまだ同じ問題を抱えています - 私はWindows上で動作しているので、それは読んでいますか? –

+0

私は、open2の行の後に2行追加することで、これを実現することができた: 'sleep(10); print $ chld_in; ' - 私は\ n \ nを受け入れる準備が整う前に子供に送信していたと仮定しています。正しい方向に私を指してくれてありがとう@セバスチャン –

2

echo "\n\n" | yourcommand 
+0

私の現在のコードは次のようになります@slines = echo "\ n \ n" | '" $ command'; ? –

関連する問題