我有一个问题。在我的Perl脚本中,我执行一个java程序,它打印到stdout和stderr流。你能不能给我一个关于如何将stderr重定向到文件并将stdout重定向到同一个文件和控制台的建议。 tee在这里不适用,因为我还需要java程序的返回码。有什么想法吗?
提前致谢!
答案 0 :(得分:3)
使用IPC :: Open3来调用java程序。使用IO :: Select从文件句柄中读取。自己写作。
IPC :: Open3为你做一个fork()和exec(),所以你可以使用waitpid获得返回值。
答案 1 :(得分:0)
您可以尝试将stderr重定向到stdout。
my $retvar = system("java -jar prog.jar 2>&1 > output.log ");
答案 2 :(得分:0)
如果你在* nix下,你应该查找“tee”命令。
你应该做的事情如下:
perl script.pl 2>stderr.out | tee stdout.out
答案 3 :(得分:0)
你不能直接从shell(没有tee)那样做。
也许您可以重定向到文件,然后从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;
希望这会有所帮助。它仍然保持文件分离,这可能不是你想要的。
米歇尔。
答案 4 :(得分:0)
考虑这样做:
perl -le 'qx(java -jar prog.jar>output.log 2>&1);$rc=$?;print "rc=",$rc<0 ? -1:$rc>>8'
这会将STDOUT和STDERR重定向到您的文件中并捕获并打印返回码。根据需要检查(或cat
)输出文件到控制台。请查看qx和system以获取更多信息。
更新:另一种方式是这样的(即二次写输出文件):
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";
答案 5 :(得分:0)
Bash包含一个选项pipefail
,让管道返回最右边的失败代码而不是最右边的退出代码。
您可以采用这样的方法在bash中使用pipefail
设置运行命令。
my $ret = system( q{bash -c 'set -o pipefail; java command 2>>~/test_file | tee -a ~/test_file'} );