bash管道输出到多个进程

bash管道输出到多个进程,bash,Bash,bash-pipe问题 我已经看到了类似的问题和答案,但我问的是关于管道输出到多个过程的最基本情况。例如,我想将fortune输出到cowsay和(espeak&)。我有一个解决方案(如下),但必须有一个更简单、更优雅的方法 joshua@joshua-HP-Pavilion-dv8-Notebook-PC~$cat.bashrc (fortune -a > ~/tmp) && echo && (cat ~/tmp |cowsay -W65) &&a

bash-pipe问题

我已经看到了类似的问题和答案,但我问的是关于管道输出到多个过程的最基本情况。例如,我想将fortune输出到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

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

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

# 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"
#将“fortune”输出存储在变量中
《财富》杂志结果=$(财富-a)
#将该变量用作多个进程的输入

(科赛-W70&&espeak&)首先,我为这个问题感到荣幸,我很高兴你在来这里提问之前尝试了一下。当我看到结果时,我有很多乐趣:)-投了赞成票

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

我使用的逻辑是:

  • 家财万贯
  • 将结果传送到cowsay&&espeak
  • 删除该文件

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

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

tee
命令可以链接在一起:

fortune | tee cowsay | tee espeak

谢谢大家的回复

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

fortune -a > a.txt && (espeak -f a.txt &) && cat a.txt |cowsay -W65 && rm a.txt
因为它在文本和语音之后显示命令提示符,并且看起来最漂亮(输出方面)。这在我的.bashrc中,所以我希望在启动终端shell时它看起来很漂亮。和我最初的尝试没什么不同

除临时文件外,任何其他方法都会首先显示命令提示符,这看起来很难看。i、 e:

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 |
                ||     ||

在回复中可以找到个人回复。我这样做对吗?

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

clear;save=$(fortune);cowsay -f gnu <<< "$save"; espeak <<< "$save"
清晰;储蓄=$(财富);cowsay-fgnu我使用xclip

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

需要首先安装xclip

《财富》杂志| xclip>阅读《财富》杂志的文章

xclip-o | cowsay->将文本发送给cowsay

xclip-o | speak-ves&
->将文本发送到espeak并给出提示

谢谢!我不得不稍微调整一下,因为我想在epseak讲话时立即得到提示。这起作用了:
fortune-a>a.txt&&(espeak-f a.txt&&&cat a.txt | cowsay-W65&&rm a.txt
你的演讲我得到了演讲稿,但是一个空的cowsay泡泡!我还需要将espeak移到命令的前面,因为在espeak找到它之前,a.txt已经被删除。在阅读了
man-tee
之后,我发现这个方法非常有效:
fortune-a | tee>(cowsay-W65)>(espeak)>-
>-
阻止复制到STDOUT。我现在唯一剩下的问题是提示出现在cowsay输出之前。我试过
&&echo
在很多地方都没有用。是的,我忘了抑制标准输出;通常我使用
>/dev/null
,但是
>-
更短。出现提示是由于进程替换的异步性质。像
mkfifoo-foo-bar这样较长的东西;《财富》-一家| teefoo>酒吧;cowsay-W65
可能会起作用。这用命名管道的显式使用代替了进程替换。避免磁盘I/O,尤其是对于几行文本,始终是一个好主意。
clear;save=$(fortune);cowsay -f gnu <<< "$save"; espeak <<< "$save"