【发布时间】:2012-02-10 06:08:13
【问题描述】:
我有问题。在我的 Perl 脚本中,我执行了一个 java 程序,它同时打印到 stdout 和 stderr 流。您能否就如何将stderr 重定向到仅文件和stdout 重定向到同一个文件和控制台给出一个平静的建议。 tee 在这里不适用,因为我还需要 java 程序的返回码。有什么想法吗?
提前致谢!
【问题讨论】:
标签: perl file redirect console
我有问题。在我的 Perl 脚本中,我执行了一个 java 程序,它同时打印到 stdout 和 stderr 流。您能否就如何将stderr 重定向到仅文件和stdout 重定向到同一个文件和控制台给出一个平静的建议。 tee 在这里不适用,因为我还需要 java 程序的返回码。有什么想法吗?
提前致谢!
【问题讨论】:
标签: perl file redirect console
使用 IPC::Open3 调用 java 程序。使用 IO::Select 从文件句柄中读取。自己写。
IPC::Open3 为您执行 fork() 和 exec(),因此您可以使用 waitpid 获得返回值。
【讨论】:
您不能直接从 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;
希望这会有所帮助。它仍然保持文件分离,这可能不是你想要的。
米歇尔。
【讨论】:
考虑这样做:
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";
【讨论】:
您可以尝试通过将 stderr 重定向到 stdout 来跟踪。
my $retvar = system("java -jar prog.jar 2>&1 > output.log ");
【讨论】:
my $retvar = system("java -jar prog.jar |tee file.txt 2>&1 > output.log ");
如果您在 *nix 下,您应该查找“tee”命令。
你可能应该这样做:
perl script.pl 2>stderr.out | tee stdout.out
【讨论】:
Bash 包含一个选项 pipefail 让管道返回最右边的失败代码而不是最右边的退出代码。
您也许可以使用类似的方法在设置了pipefail 的 bash 中运行您的命令。
my $ret = system( q{bash -c 'set -o pipefail; java command 2>>~/test_file | tee -a ~/test_file'} );
【讨论】: