2012-02-09 46 views
0

問題があります。私のPerlスクリプトでは、stdoutストリームとstderrストリームの両方に出力するJavaプログラムを実行します。 stderrをファイルのみにリダイレクトし、stdoutを同じファイルとコンソールにリダイレクトする方法のアドバイスをお願いします。 Javaプログラムのリターンコードが必要なので、ここではteeは適用されません。何か案は?Perl:出力をファイルとコンソールの両方にリダイレクトし、リターンコードを保持

ありがとうございます!

答えて

3

使用IPC ::のopen3 Javaプログラムを呼び出す:もう一つの方法は、このようなもの(すなわち、二次出力ファイルの書き込み)です。 IO ::を使用して、ファイルハンドルから読み込みます。自分で書く。

IPC :: Open3はあなたのためにfork()とexec()を実行するので、waitpidを使用して戻り値を取得します。

0

stderrを標準出力にリダイレクトすることでフォローできます。

my $retvar = system("java -jar prog.jar 2>&1 > output.log "); 
+0

ええ、試しましたが、私はコンソールからjavaからも出力したいと思っています。それは私が解決できない問題です。 –

+0

tee - 'my $ retvar = system(" java -jar prog.jar | tee file.txt 2>&1> output.log ");' – Konerak

+0

teeは私にJavaの使い方を知らせるリターンコードを取得できないようにします。コードは彼の仕事をした。 –

0

* nixの下にいる場合は、「tee」コマンドを検索する必要があります。あなたは(ティーなし)シェルから直接それを行うことはできません

perl script.pl 2>stderr.out | tee stdout.out 
+0

いいえ、それは私が探しているものではありません。私はリダイレクションをJavaプログラムの出力に対してのみ行う必要があります。また、条件は、私はperlスクリプトの実行ステートメントに何も追加できないようになっています。 –

+0

さて、おそらくIPC :: Open3モジュールの "open3"関数を使うことができます。STDIN、STDOUT、およびSTDERRのハンドルを別々に開くことができます。必要に応じて、STDOUTおよびSTDERRのJavaプログラム出力を1行ずつ読み込んでファイルに書き込むことができます。 – JackTheRandom

+0

そして、CPANのドキュメントに、open3を使って終了コードを取得する方法の例があります。 – JackTheRandom

0

あなたは、おそらくのような何かを行う必要があります。

多分あなたはファイルにリダイレクトしてから、そのファイルをperlスクリプトの中から開いてコンソールに出力することができます。次のようなものがあります。

use Path::Class; # Handy module, but you can do without 

my $retvar = system("java -jar prog.jar >stdout.log 2>stderr.log "); 

my $output = file('.', 'stdout.log')->slurp(); 
print $output; # or print STDERR $output; 

これはちょっと役立ちます。それはまだファイルを分離した状態に保ちますが、これはあなたが望むものではないかもしれません。

ミシェル。

+0

あなたの入力のために、Michele。私が実際に欲しいものではありませんが、私が必要とするものをすることは不可能です。 –

0

thuslyそれをやって考えてみましょう:

perl -le 'qx(java -jar prog.jar>output.log 2>&1);$rc=$?;print "rc=",$rc<0 ? -1:$rc>>8' 

これはあなたのファイルとキャプチャに両方のSTDOUTとSTDERRをリダイレクトし、リターンコードが印刷されます。必要に応じて、出力ファイルをコンソールに調べます(またはcat)。より多くの洞察を得るにはqxsystemを見てください。

UPDATE:

my $msg=qx(java -jar prog.jar 2>&1); 
my $rc=$? < 0 ? -1 : $? >>8, "\n"; 
print $msg, "rc=$rc\n"; 
open my $fh, '>', 'output.log' or die "$!\n"; 
print {$fh} $msg, "rc=$rc\n"; 
+0

すべては問題ありませんが、残念ながらコンソールに出力はありません。 –

+0

いいえ、コンソールには出力されません。私が言ったように、あなたはcat(シェルで)や出力ファイルをコンソールに出力することができます。出力ファイルだけが空でない場合(size> 0)、それを行うことができます。 – JRFerguson

0

バッシュには、右端の終了コードの代わりに右端の失敗コードをパイプラインに戻すオプションpipefailが含まれています。

pipefailを設定してbashでコマンドを実行すると、このようなことが起きる可能性があります。

my $ret = system(q{bash -c 'set -o pipefail; java command 2>>~/test_file | tee -a ~/test_file'}); 
関連する問題