bash管道输出到多个进程

时间:2015-10-19 19:07:37

标签: bash

bash pipe问题

我已经看到类似的问题和答案,但我问的是管道输出到多个过程的基本情况。例如,我想输出命运给cowsay和(espeak&)。我有一个解决方案(以下),但必须有一个更简单,更优雅的方式。

joshua @ joshua-HP-Pavilion-dv8-Notebook-PC~ $ cat .bashrc

(fortune -a > ~/tmp) && echo && (cat ~/tmp |cowsay -W65) && (cat ~/tmp | espeak &)
rm ~/tmp

输出:

  ___________________________________________
/ I ain't got no quarrel with them Viet Congs. \
|                                              |
\ -- Muhammad Ali                              /
 ----------------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
joshua@joshua-HP-Pavilion-dv8-Notebook-PC ~ $ 

另外,来自espeak的音频作为后台进程运行(| espeak&)。 我的解决方案将输出重定向到文件(〜/ tmp),执行操作,然后删除〜/ tmp。我为什么不能这样做,例如:

fortune -a | (cowsay -W70 && espeak &)

? 我尝试了很多变化,这是我的尝试历史:

  501     fortune -a | (cowsay -W70 && espeak &)
  502     fortune -a | (cowsay -W70 && espeak)
  503     fortune -a | (cowsay -W70 | espeak)
  504     fortune -a | (cowsay -W70;  espeak)
  505     fortune -a | (espeak | cowsay -W70; espeak)
  506     fortune -a | (espeak | cowsay -W70)
  507     fortune -a | (espeak & | cowsay -W70)
  508     fortune -a | (espeak & && cowsay -W70)
  509     fortune -a | (espeak && cowsay -W70)
  510  fortune -a | (espeak && cowsay -W70)
  511  (fortune |cowsay -W65) && (cat ~/tmp | espeak &)
  512  (fortune |cowsay -W65) && ( espeak &)
  513  (fortune |cowsay -W65) && espeak &
  514  fortune | (cowsay -W65 && espeak &)
  515  history

此外,这是我发布问题的第一次尝试。建设性的反馈欢迎!

7 个答案:

答案 0 :(得分:2)

您可以将tee与流程替换结合使用。

fortune -a | tee >(cowsay -W65) >(espeak)

答案 1 :(得分:1)

为什么不调用fortune -a once并将其结果存储在变量中?

# Store "fortune" output in a variable
fortune_result=$(fortune -a)

# Use that variable as input for multiple processes
(cowsay -W70 && espeak &) <<< "$fortune_result"
(cowsay -W70 && espeak) <<< "$fortune_result"
(cowsay -W70 | espeak) <<< "$fortune_result"

答案 2 :(得分:1)

首先对这个问题赞不绝口,我很高兴你在来到这里问之前尝试过。当我看到输出时,我有很多乐趣:) - Upvoted。

到目前为止,我最好的结果是(我认为比你的更简单)

fortune -a > a.txt | cowsay && espeak -f a.txt && rm a.txt 

我使用的逻辑是:

  • 财富到文件
  • 将结果传递给cowsay&amp;&amp; espeak
  • 删除文件。

答案 3 :(得分:1)

tee命令可以链接在一起:

fortune | tee cowsay | tee espeak

答案 4 :(得分:1)

这是我的解决方案。首先,你保存财富结果,而不是使用之前保存的文本打印cowsay,最后使用espeak。

array(4) (
  [Administrator] => array(0)
  [0] => array(1) (
    [Administrator] => (string) Account_Manager
  )
  [1] => array(1) (
    [Account_Manager] => (string) BlogAuthor
  )
  [2] => array(1) (
    [Account_Manager] => (string) CommentManager
  )
)

答案 5 :(得分:0)

谢谢大家的有益回复!

我到目前为止找到的用例的最佳解决方案是:

fortune -a > a.txt && (espeak -f a.txt &) && cat a.txt |cowsay -W65 && rm a.txt

因为它在文本和语音之后显示命令提示符并且看起来最好(输出方式)。这是在我的.bashrc中,所以当我启动终端shell时,我希望它看起来不错。与我最初的尝试没什么不同!

除了临时文件以外的任何方式执行此操作首先会显示命令提示符,这看起来很丑陋。即:

joshua@joshua ~ $  _________________________________________
/ Be wary of strong drink. It can make    \
| you shoot at tax collectors and miss.   |
|                                         |
\ -- Lazarus Long, "Time Enough for Love" /
 -----------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

回复中的个人回复。我这样做了吗?

答案 6 :(得分:0)

我使用xclip

财富| xclip; xclip -o | cowsay; xclip -o | espeak -ves&amp;

首先需要安装xclip。

财富| xclip &gt;从财富中读取文字。

xclip -o | cowsay - &gt;将文本发送给cowsay。

xclip -o |说 - ves&amp;                          - &GT;将文本发送到espeak并提示您。