【问题标题】:Capturing STDERR捕获 STDERR
【发布时间】:2012-11-29 00:37:19
【问题描述】:

运行此命令时,我试图仅捕获 STDERR

my @output = `cleartool setview -exec "cd $myPath; $myBuildCommand" $myView 1>/dev/null`;

但是,我总是在 @output 中同时获得 STDERR 和 STDOUT。

我正在尝试从运行 $myBuildCommand 中捕获警告和错误。有什么好办法吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    在将 STDOUT 重定向到 /dev/null 之前将 STDERR 重定向到 STDOUT。顺序很重要!

    my $stderr = `some-command 2>&1 > /dev/null`;
    

    如果您颠倒重定向的顺序,那么 STDERR 和 STDOUT 都会以 /dev/null 结束。

    【讨论】:

    • 好吧,我不知道。但是,我一定还是做错了什么。我想我正在重定向其他东西,因为@output 总是同时获得 STDERR 和 STDOUT
    • 您的原始问题仅显示您重定向 STDOUT,而不是 STDERR。顺便说一句,perldoc.perl.org/perlop.html 列出了捕获 STDERR 而不是 STDOUT 的示例(查找 qxbacktick)。
    • 我试图从命令行执行此操作:ls 2>&1 1>/dev/null 给我“不明确的输出重定向
    【解决方案2】:

    如果您想执行任何类型的重要命令来捕获您几乎肯定想要IPC::Run

    use IPC::Run 'run';
    
    my $exitcode = run [ $command, @args ], '>', \my $stdout, '2>', \my $stderr;
    

    此时,$stdout$stderr 这两个标量现在将分别包含程序写入 STDOUT 和 STDERR 的任何内容。

    【讨论】:

      【解决方案3】:

      要捕获命令的 STDERR 但丢弃其 STDOUT(此处排序很重要):

       my @output = `cmd 2>&1 1>/dev/null`;
      

      另请参阅 perlfaq8 中的 How can I capture STDERR from an external command?

      【讨论】:

      • 我试图从命令行执行此操作:ls 2>&1 1>/dev/null 给我“不明确的输出重定向”
      • @user1758367 “不明确的重定向”意味着您正在使用 csh。 csh 没有提供一个健全的机制来分离 stdout 和 stderr。
      猜你喜欢
      • 1970-01-01
      • 2012-02-29
      • 2013-01-12
      • 2011-10-17
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      相关资源
      最近更新 更多