問題があります。私のPerlスクリプトでは、stdoutストリームとstderrストリームの両方に出力するJavaプログラムを実行します。 stderrをファイルのみにリダイレクトし、stdoutを同じファイルとコンソールにリダイレクトする方法のアドバイスをお願いします。 Javaプログラムのリターンコードが必要なので、ここではteeは適用されません。何か案は?Perl:出力をファイルとコンソールの両方にリダイレクトし、リターンコードを保持
ありがとうございます!
問題があります。私のPerlスクリプトでは、stdoutストリームとstderrストリームの両方に出力するJavaプログラムを実行します。 stderrをファイルのみにリダイレクトし、stdoutを同じファイルとコンソールにリダイレクトする方法のアドバイスをお願いします。 Javaプログラムのリターンコードが必要なので、ここではteeは適用されません。何か案は?Perl:出力をファイルとコンソールの両方にリダイレクトし、リターンコードを保持
ありがとうございます!
使用IPC ::のopen3 Javaプログラムを呼び出す:もう一つの方法は、このようなもの(すなわち、二次出力ファイルの書き込み)です。 IO ::を使用して、ファイルハンドルから読み込みます。自分で書く。
IPC :: Open3はあなたのためにfork()とexec()を実行するので、waitpidを使用して戻り値を取得します。
stderrを標準出力にリダイレクトすることでフォローできます。
my $retvar = system("java -jar prog.jar 2>&1 > output.log ");
* nixの下にいる場合は、「tee」コマンドを検索する必要があります。あなたは(ティーなし)シェルから直接それを行うことはできません
perl script.pl 2>stderr.out | tee stdout.out
いいえ、それは私が探しているものではありません。私はリダイレクションをJavaプログラムの出力に対してのみ行う必要があります。また、条件は、私はperlスクリプトの実行ステートメントに何も追加できないようになっています。 –
さて、おそらくIPC :: Open3モジュールの "open3"関数を使うことができます。STDIN、STDOUT、およびSTDERRのハンドルを別々に開くことができます。必要に応じて、STDOUTおよびSTDERRのJavaプログラム出力を1行ずつ読み込んでファイルに書き込むことができます。 – JackTheRandom
そして、CPANのドキュメントに、open3を使って終了コードを取得する方法の例があります。 – JackTheRandom
:
あなたは、おそらくのような何かを行う必要があります。
多分あなたはファイルにリダイレクトしてから、そのファイルを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;
これはちょっと役立ちます。それはまだファイルを分離した状態に保ちますが、これはあなたが望むものではないかもしれません。
ミシェル。
あなたの入力のために、Michele。私が実際に欲しいものではありませんが、私が必要とするものをすることは不可能です。 –
thuslyそれをやって考えてみましょう:
perl -le 'qx(java -jar prog.jar>output.log 2>&1);$rc=$?;print "rc=",$rc<0 ? -1:$rc>>8'
これはあなたのファイルとキャプチャに両方のSTDOUTとSTDERRをリダイレクトし、リターンコードが印刷されます。必要に応じて、出力ファイルをコンソールに調べます(またはcat
)。より多くの洞察を得るにはqxとsystemを見てください。
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";
すべては問題ありませんが、残念ながらコンソールに出力はありません。 –
いいえ、コンソールには出力されません。私が言ったように、あなたはcat(シェルで)や出力ファイルをコンソールに出力することができます。出力ファイルだけが空でない場合(size> 0)、それを行うことができます。 – JRFerguson
バッシュには、右端の終了コードの代わりに右端の失敗コードをパイプラインに戻すオプションpipefail
が含まれています。
pipefail
を設定してbashでコマンドを実行すると、このようなことが起きる可能性があります。
my $ret = system(q{bash -c 'set -o pipefail; java command 2>>~/test_file | tee -a ~/test_file'});
ええ、試しましたが、私はコンソールからjavaからも出力したいと思っています。それは私が解決できない問題です。 –
tee - 'my $ retvar = system(" java -jar prog.jar | tee file.txt 2>&1> output.log ");' – Konerak
teeは私にJavaの使い方を知らせるリターンコードを取得できないようにします。コードは彼の仕事をした。 –