Perl:将输出重定向到文件和控制台,保留返回码

时间:2012-02-09 11:54:50

标签: perl file redirect console

我有一个问题。在我的Perl脚本中,我执行一个java程序,它打印到stdout和stderr流。你能不能给我一个关于如何将stderr重定向到文件并将stdout重定向到同一个文件和控制台的建议。 tee在这里不适用,因为我还需要java程序的返回码。有什么想法吗?

提前致谢!

6 个答案:

答案 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)输出文件到控制台。请查看qxsystem以获取更多信息。

更新:另一种方式是这样的(即二次写输出文件):

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'} );