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
此外,这是我发布问题的第一次尝试。建设性的反馈欢迎!
答案 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
我使用的逻辑是:
答案 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并提示您。