我想执行一个命令,让该命令的输出动态地获取gzip,并且还回显/发出该命令的输出.
即,像:
echo "hey hey, we're the monkees" | gzip --stdout > my_log.gz
除了行执行之外,我想在标准输出上看到这个:
hey hey, we're the monkees
greyfade.. 54
另一种方式(假设shell像bash
或zsh
):
echo "hey hey, we're the monkees" | tee >(gzip --stdout > my_log.gz)
公认的奇怪>()
语法基本上做了以下事情:
创建新的FIFO(通常是内容/tmp/
)
在内部执行命令()
并将FIFO绑定到该子命令上的stdin
将FIFO文件名返回到命令行.
什么tee
最终看到的话,是这样的:
tee /tmp/arjhaiX4
所有gzip
看到的都是它的标准输入.
对于Bash,请参阅man bash
详细信息.它位于重定向部分.对于Zsh,请参阅man zshexpn
"过程替换"标题下的内容.
据我所知,Korn Shell,经典Bourne Shell的变种(包括灰和破折号)和C Shell不支持这种语法.
另一种方式(假设shell像bash
或zsh
):
echo "hey hey, we're the monkees" | tee >(gzip --stdout > my_log.gz)
公认的奇怪>()
语法基本上做了以下事情:
创建新的FIFO(通常是内容/tmp/
)
在内部执行命令()
并将FIFO绑定到该子命令上的stdin
将FIFO文件名返回到命令行.
什么tee
最终看到的话,是这样的:
tee /tmp/arjhaiX4
所有gzip
看到的都是它的标准输入.
对于Bash,请参阅man bash
详细信息.它位于重定向部分.对于Zsh,请参阅man zshexpn
"过程替换"标题下的内容.
据我所知,Korn Shell,经典Bourne Shell的变种(包括灰和破折号)和C Shell不支持这种语法.
echo "hey hey, we're the monkees" | tee /dev/tty | gzip --stdout > my_log.gz
正如评论中指出的那样,/dev/stdout
可能比/dev/tty
在某些情况下更好.
有一个漂亮的发球台!
tee命令将标准输入复制到标准输出,也复制到作为参数给出的任何文件.当您不仅希望沿管道发送一些数据,而且还希望保存副本时,这非常有用
因为我有一个缓慢的下午,这里有一些光彩照人的ascii-art ......
+-----+ +---+ +-----+ stdin -> |cmd 1| -> stdout -> |tee| -> stdout -> |cmd 2| +-----+ +---+ +-----+ | v file
正如greyfade在另一个答案中演示的那样,"文件"不一定是常规文件,但可以是FIFO,让你将tee'd输出传递给第三个命令.
+-----+ +---+ +-----+ stdin -> |cmd 1| -> stdout -> |tee| -> stdout -> |cmd 2| +-----+ +---+ +-----+ | v FIFO | v +-----+ |cmd 3| +-----+
只是发布一个不涉及触摸磁盘的方式:
echo "hey hey, we're the monkees" | (exec 1>&3 && tee /proc/self/fd/3 | gzip --stdout > my_log.gz)