【问题标题】:How do I redirect the output of Perl script executed from within another perl script to a file?如何将在另一个 perl 脚本中执行的 Perl 脚本的输出重定向到文件?
【发布时间】:2011-11-18 07:55:41
【问题描述】:

我正在通过 crontab 运行 perl 脚本并将其输出重定向到文件:

30 1 * * * /full/path/to/my_script.pl >> /full/path/to/my_log_file

在 my_script.pl 中,我正在通过 system() 命令执行其他几个 perl 脚本:

#/usr/bin/env perl
system( "/full/path/to/another_script.pl" );

在这些脚本中,我使用“打印”来写入 STDOUT:

#/usr/bin/env perl
print "Standard output...\n";

然而,这些子脚本的输出似乎都没有被重定向到 my_log_file- 我看到的唯一输出是父 perl 脚本的输出。我错过了一些明显的东西吗?这是在linux系统上的。

【问题讨论】:

    标签: perl unix command-line redirect


    【解决方案1】:

    嗯,如果使用 system(),那么 STDOUT 应该会重新出现在您的日志中。

    你有例子吗?

    我立即想到 system() 调用实际上并没有运行其他脚本 - 你使用脚本的完整路径吗?请记住,cron 不会具有与您的 shell 相同的 $PATH,因此可能找不到您尝试运行的脚本,除非它们具有完整路径。

    您还可以在日志中捕获 STDERR: 30 1 * * * /my_script.pl 2>&1 >> my_log_file

    【讨论】:

    • 这很有趣,使用“@>&1”的技术会同时将 STDOUT 和 STDERR 捕获到 my_log_file 吗?是的,我正在使用 crontab 中的主脚本和 system() 命令中的子脚本的完整路径。
    • 我在原帖中添加了一些额外的细节。
    • Yes - 2>&1 导致文件句柄 2 (STDERR) 被重定向到文件句柄 1 (STDOUT)。然后使用 >>(对于 STDOUT)导致 STDOUT 和 STDERR 输出都进入您的日志文件。
    • #/usr/bin/env perl
    • 其他要检查的事情:system() 的返回值 - 它应该是 0。尝试使用反引号 $output = ``/full/path/to/another_script.pl``; print $output;(好的 - 我不知道如何让这个显示一个反引号,因为那是“代码”的标记)和陷阱错误。评估 { 系统(“..”); }; if ($@) { print "错误: $@\n"; }
    【解决方案2】:

    qx代替system()

    print qx( "/full/path/to/another_script.pl" );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多