【问题标题】:How to redirect stderr to a file for the whole pipe?如何将stderr重定向到整个管道的文件?
【发布时间】:2017-04-10 23:07:10
【问题描述】:

我正在运行这样的命令:

mycmd1 | mycmd2 | mycmd3 | lp

有没有办法将 stderr 重定向到整个管道的文件,而不是为每个命令重复它?

也就是说,我宁愿避免这样做:

mycmd1 2>/myfile | mycmd2 2>/myfile | mycmd3 2>/myfile | lp 2>/myfile

【问题讨论】:

    标签: bash pipe stderr


    【解决方案1】:

    要么

    { mycmd1 | mycmd2 | mycmd3 | lp; } 2>> logfile
    

    ( mycmd1 | mycmd2 | mycmd3 | lp ) 2>> logfile
    

    会起作用。 (第一个版本的启动时间可能稍快(~1ms),具体取决于 shell)。

    【讨论】:

    • { ...; } 更好,因为它不会创建子shell。
    • 为什么子shell不受欢迎?
    • @springloaded,创建子shell 有性能成本(典型的实现是fork()——确切的成本因平台而异,但在一个紧密的循环中它非常重要,在 Windows 上它们往往是更昂贵更广泛)。除此之外,它们会影响变量范围:如果您在 lastpipe 为 true 的 shell 中,lp 可能是在 { ... | lp; } 情况下更改 shell 变量的命令,而不是在 ( ... | lp ) 情况下更改的命令,而这些更改不会被静默子shell退出时丢失。见BashFAQ #24
    【解决方案2】:

    我尝试了以下方法,它似乎有效:

    (mycmd1 | mycmd2 | mycmd3 | lp) 2>>/var/log/mylogfile.log
    

    我使用>> 是因为我想追加到日志文件而不是每次都覆盖它。

    【讨论】:

      猜你喜欢
      • 2013-08-05
      • 2015-06-21
      • 2014-09-30
      • 2014-07-22
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多