【问题标题】:Tee to commands only, not stdout仅对命令发球,而不是标准输出
【发布时间】:2019-04-05 03:36:57
【问题描述】:

我已经知道如何使用tee 和进程替换来将输出发送到各种命令,标准输出,例如

command0 | tee >(command1) >(command2)

使用上述行,stdout 将由来自command0command1command2 的交错行组成。

有没有办法阻止 tee 写入标准输出,而不删除它管道到的任何命令的输出?所以对于上面的例子,stdout 是否只有来自command1command2 的输出? 大多数与teeing 没有标准输出相关的答案只是直接写入文件,并建议使用这样的东西:

command0 | tee file1 file2 >/dev/null

但是使用进程替换,这也会消耗其他命令的所有输出。

command0 | tee >(command1) >(command2) >/dev/null

有没有办法告诉tee不要打印到标准输出,或者只使用直接来自tee的输出?

【问题讨论】:

    标签: bash tee


    【解决方案1】:

    试试这个:

    ( command0 | tee >(command1 1>&3 ) | command2 ) 3>&1
    

    它将 command1 的标准输出重定向到管道 3,因此 command2 只能看到原始源。最后,您再次将管道 3 重定向到标准输出。

    用这个来测试它:

    ( echo test | tee >( sed 's/^/1 /' >&3 )  | sed 's/^/2 /' ) 3>&1
    

    输出是无序的,在我的例子中:

    2 test
    1 test
    

    【讨论】:

      【解决方案2】:

      我见过commentanswer 使用了一个额外的>,但并没有真正解释它为什么会这样做。似乎它正在重定向输出 somewhere 但到目前为止我所能说的是它可以满足我的需求。这有效:

      command0 | tee > >(command1) >(command2)
      command0 | tee >(command1) > >(command2)
      

      额外的> 在哪里似乎并不重要,只要它在tee 的至少一个参数之前。所以这行不通:

      command0 | tee >(command1) >(command2) >
      

      不知道这叫什么,也没有进一步的线索,我无法进一步解释。

      【讨论】:

      • > >(foo) 重定向到 process substitution >(foo)。进程替换涉及将>(foo) 替换为代表foo 的标准输入的文件的路径,因此可以将其视为tee > /some/stdin1 /some/stdin2,或等效的tee /some/stdin2 > /some/stdin1,这应该可以清楚地说明发生了什么。
      • 这让我认为它会将管道输出的附加副本发送到进程,但我凭经验知道事实并非如此。链接的文档似乎也没有在任何地方提到这种模式。
      • 哦,你是说>(foo)> >(foo)的情况下不再是tee的参数,而只是命令中间的重定向?
      • 是的,> >(foo) 是命令中间的重定向。只需将>(foo) 视为文件的路径(一个特殊的文件,但仍然是一个文件)。
      • 我刚刚意识到,我不确定我是如何得出>/dev/null 在这种情况下失败的结论,因为它没有。它只捕获来自tee 的标准输出的输出,而不是它发送输出的进程。
      猜你喜欢
      • 1970-01-01
      • 2014-10-09
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多