【问题标题】:How do I avoid printing to STDOUT when using Perl's `IPC::System::Simple:runx`?使用 Perl 的 `IPC::System::Simple:runx` 时如何避免打印到 STDOUT?
【发布时间】:2011-04-13 14:41:36
【问题描述】:

我正在使用IPC::System::Simple:runx 来执行系统命令并死于意外的返回值。问题是命令输出被打印到shell。

  1. 如何避免打印此内容 输出?
  2. 如何避免打印此输出 但是将其放入 perl 变量中?

更新

3) 如果执行失败,我如何打印此输出?

【问题讨论】:

    标签: perl system stdout


    【解决方案1】:

    capture() 命令?或者 capturex()。

    引用自链接:

    异常处理

    在命令返回意外状态的情况下,run 和 capture 都会抛出异常,如果没有被捕获,将终止你的程序并报错。

    捕获异常很容易:

    eval {
        run("cat *.txt");
    };
    
    if ($@) {
        print "Something went wrong - $@\n";
    }
    

    有关详细信息,请参阅下面的诊断部分。

    【讨论】:

    • 谢谢,但就执行阶段而言,capture 是否与 runx 相同(socu 表示 catpure 的作用类似于反引号,而 run 的作用类似于 system)?我可以打印仅在失败时捕获的内容吗?
    • 谢谢。显然capturex 默认情况下完全符合我的要求:如果一切正常,它会保持沉默,如果发生错误(即意外的返回值等),它会死掉,但首先会打印命令的输出以及它自己的消息。太好了!
    【解决方案2】:

    如果一个模块确实表现得非常糟糕并且直接打印到 STDOUT,你总是可以将 STDOUT 重定向到其他东西。这种 hack 但有些模块需要它。

    # Save STDOUT for restore later
    open(OLD_STDOUT, ">>&STDOUT");
    open(STDOUT, ">/some/file/or/dev/null");
    # call your module
    # Restore STDOUT
    open(STDOUT, ">>&OLD_STDOUT");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 2019-10-28
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多