首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将stdout管道到多个进程[zsh]

将stdout管道到多个进程[zsh]
EN

Stack Overflow用户
提问于 2011-02-15 01:45:10
回答 3查看 1.9K关注 0票数 7

我知道zsh有这样的能力:

代码语言:javascript
复制
ls -1 >foo >bar

但是假设我想通过另一个命令运行这两个输出。例如,我如何组合这两个命令,以避免两次运行mysqldump

代码语言:javascript
复制
mysqldump db1 | bzip2 > db1.sql.bz2
mysqldump db1 | mysql db2

我能想到的最接近的结果是:

代码语言:javascript
复制
mysqldump db1 >db1.sql | mysql db2
bzip2 db1.sql

但是我不想把文件未经压缩地写到磁盘上(它很大!)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-15 02:31:33

以下是工作原理:

代码语言:javascript
复制
echo abc > >(gzip > 1) > >(xz > 2)

针对您的示例进行了修改(但未经测试):

代码语言:javascript
复制
mysqldump db1 > >(bzip2 > db1.sql.bz2) > >(mysql db2)

或者,也许更好:

代码语言:javascript
复制
{ mysqldump db1 } > >(bzip2 > db1.sql.bz2) > >(mysql db2)

//我在man zshexpn的进程替换部分找到了几乎相同的示例

还注意到,前面的示例可以更紧凑、更有效地编写(假设设置了MULTIOS选项):

粘贴<(cut -f1 file1) <(cut -f3 file2) \> >(process1) > >(process2)

在上面的示例中,shell使用管道而不是FIFO来实现后两个进程替换。

>(进程)还有一个额外的问题;当它附加到外部命令时,父shell不会等待进程完成,因此紧随其后的命令不能依赖于结果的完成。问题和解决方案与zshmisc(1)中的MULTIOS小节中描述的相同。因此,在上面示例的简化版本中:

粘贴<(cut -f1 file1) <(cut -f3 file2) >>(进程)

(请注意,不涉及MULTIOS ),进程将异步运行。解决方法是:

{ paste <(cut -f1 file1) <(cut -f3 file2) }>>(进程)

这里的额外进程是从等待它们完成的父shell衍生而来的。

票数 7
EN

Stack Overflow用户

发布于 2011-02-15 02:31:52

您可以使用进程替换。

在zsh中:

代码语言:javascript
复制
ls -1 > >(grep foo) > >(grep bar)

在bash中:

代码语言:javascript
复制
ls -1 | tee >(grep foo) >(grep bar) >/dev/null

进程替换为您管理命名管道。

票数 7
EN

Stack Overflow用户

发布于 2011-02-15 01:52:37

您可以通过fifo连接进程,并使用tee实用程序将标准输出复制到每个fifo和stdout。类似于:

代码语言:javascript
复制
mkfifo db1.sql
bzip2 db1.sql &
mysqldump db1 | tee db1.sql | mysql db2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4995405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档