2009-04-17 4 views
7

私はこのperlのアプリがある場合:バックリックで出力をフラッシュする方法Perl?

print `someshellscript.sh`; 

原料の束を印刷し、私はシェルスクリプトの実行の途中でその出力を印刷する方法を、完了するまでに長い時間がかかりますか?

Perlは完了したときにsomeshellscript.sh結果のみを出力するようですが、実行中に出力をフラッシュする方法はありますか?

答えて

16

あなたはおそらく何をしたいのか、このようなものです:

open(F, "someshellscript.sh|"); 
while (<F>) { 
    print; 
} 
close(F); 

これはsomeshellscript.shを実行し、出力を読み取るパイプを開きます。 whileループは、スクリプトによって生成された出力の各行を読み取り、それを出力します。詳細については、openのマニュアルページを参照してください。

+4

私が追加する唯一のことは、通常は字句ファイルハンドルを使う方が良いということです:open $ fh、 "someshellscript.sh |"または死ぬ$! – friedo

+0

なぜそれが良いですか? –

+3

@Nathan:(1)あなたが含んでいるスコープ内の既存のファイルハンドルを誤って壊すことはできません。 (2)ファイルハンドルへのすべての参照が消えると(通常はスコープ出口で)、字句ファイルハンドルが自動的に閉じられます。 –

3

バックティックでエスケープすると、スクリプトが文字列に格納されてから印刷されるという問題があります。このため、プリントを「フラッシュ」する方法はありません。システム()コマンドを使用して

は連続して出力を印刷する必要がありますが、あなたは出力をキャプチャすることができません。

system "someshellscript.sh"; 
+0

+1。編集:システム()の簡単なデモンストレーションを追加し、それ以外の場合は冗長だった自分の答えを削除しました。 –

関連する問題