【问题标题】:Redirect terminal stdout through command通过命令重定向终端标准输出
【发布时间】:2014-10-11 17:00:08
【问题描述】:

我想做的只是将执行命令的标准输出重定向到管道。一个例子会比我解释得更好。

$ echo "Hello world" | cowsay

在cowsay中输出“Hello world”,我想预处理终端的/bash标准输出以通过cowsay

$ echo "Hello world"

这应该与第一个命令的输出相同。

提前致谢。

【问题讨论】:

    标签: bash redirect terminal pipe stdout


    【解决方案1】:

    您可以使用命名管道:

    mkfifo /tmp/cowsay_pipe
    cowsay < /tmp/cowsay_pipe &
    exec > /tmp/cowsay_pipe # Redirect all future output to the pipe
    echo "Hello world"
    

    【讨论】:

      【解决方案2】:

      您可以使用进程替换:

      #!/bin/bash
      exec >  >(cowsay)
      echo "Hello world"
      

      但是,有一些警告。如果你在后台启动任何东西,牛会等待它完成:

      #!/bin/bash
      exec >  >(cowsay)
      echo "Hello world"
      sleep 30 &           # Runs in the background
      exit                 # Script exits immediately but no cow appears
      

      在这种情况下,脚本将退出且没有输出。 30秒后,当sleep退出时,牛突然出现。

      您可以通过告诉程序在其他地方写入来解决此问题,这样牛就不必等待它们:

      #!/bin/bash
      exec >  >(cowsay)
      echo "Hello world"
      sleep 30 > /dev/null & # Runs in the background and doesn't keep the cow waiting
      exit                   # Script exits and the cow appears immediately.
      

      如果您不在后台启动任何东西,您的某个工具或程序就会启动。要查找哪些,请一一重定向或注释掉它们,直到出现奶牛。

      【讨论】:

      • 这对我不起作用,所有标准输出都被清除了,屏幕上什么也没有显示
      • @JoanFont 编辑了答案,添加了演示。有用。如果不适合您,您应该提供更多详细信息。
      • @jm666 我已经尝试使用cat -n 并且它有效,但是当我通过cowsay 时,输出为空
      • @JoanFont 请先尝试给出的示例,然后再将其应用于您自己的程序。在您的情况下,您或您调用的工具可能会在后台启动某些内容(cowsay 将等到它们退出,以防它们输出奶牛应该说的内容)。
      猜你喜欢
      • 1970-01-01
      • 2012-11-15
      • 2020-06-26
      • 2017-03-31
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      相关资源
      最近更新 更多