我知道zsh有这样的能力:
ls -1 >foo >bar但是假设我想通过另一个命令运行这两个输出。例如,我如何组合这两个命令,以避免两次运行mysqldump?
mysqldump db1 | bzip2 > db1.sql.bz2
mysqldump db1 | mysql db2我能想到的最接近的结果是:
mysqldump db1 >db1.sql | mysql db2
bzip2 db1.sql但是我不想把文件未经压缩地写到磁盘上(它很大!)。
发布于 2011-02-15 02:31:33
以下是工作原理:
echo abc > >(gzip > 1) > >(xz > 2)针对您的示例进行了修改(但未经测试):
mysqldump db1 > >(bzip2 > db1.sql.bz2) > >(mysql db2)或者,也许更好:
{ 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衍生而来的。
发布于 2011-02-15 02:31:52
您可以使用进程替换。
在zsh中:
ls -1 > >(grep foo) > >(grep bar)在bash中:
ls -1 | tee >(grep foo) >(grep bar) >/dev/null进程替换为您管理命名管道。
发布于 2011-02-15 01:52:37
您可以通过fifo连接进程,并使用tee实用程序将标准输出复制到每个fifo和stdout。类似于:
mkfifo db1.sql
bzip2 db1.sql &
mysqldump db1 | tee db1.sql | mysql db2https://stackoverflow.com/questions/4995405
复制相似问题