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