如何将标准gzip到文件中并将标准打印到标准输出?

时间:2009-02-20 19:49:12

标签: linux bash shell tee

我想执行一个命令,让该命令的输出动态地获取gzip,并且还回显/发出该命令的输出。

,例如:

echo "hey hey, we're the monkees" | gzip --stdout > my_log.gz

除了行执行时,我想在标准输出中看到这个:

hey hey, we're the monkees

4 个答案:

答案 0 :(得分:54)

另一种方式(假设像bashzsh这样的shell):

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了解详情。它位于redirection的部分。对于Zsh,请参阅“过程替换”标题下的man zshexpn

据我所知,Korn Shell,经典Bourne Shell的变体(包括ash和dash)和C Shell不支持这种语法。

答案 1 :(得分:46)

echo "hey hey, we're the monkees" | tee /dev/tty | gzip --stdout > my_log.gz

正如评论中所指出的,/dev/stdout在某些情况下可能比/dev/tty效果更好。

答案 2 :(得分:17)

有一杯好tee

  

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|
                                    +-----+

答案 3 :(得分:6)

发布一种不涉及触摸磁盘的方式:

echo "hey hey, we're the monkees" | (exec 1>&3 && tee /proc/self/fd/3 | gzip --stdout > my_log.gz)