当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将标准gzip到文件中并将标准打印到标准输出?》经验,为你挑选了4个好方法。

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

即,像:

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

除了行执行之外,我想在标准输出上看到这个:

hey hey, we're the monkees

greyfade.. 54

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

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不支持这种语法.



1> greyfade..:

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

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不支持这种语法.



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

正如评论中指出的那样,/dev/stdout可能比/dev/tty在某些情况下更好.


当stdout转到文件而不是终端时.
/ dev/tty是当前终端的同义词.提问者以习惯的方式使用"标准输出"来表示当前的终端,而不是对该术语的更严格的定义.
什么/ dev/tty在那里做?原始问题需要标准输出的输出,而不是终端上的输出.
如果确实习惯使用"标准输出"来表示"当前终端",那么这将是一种可能导致混乱的习惯!对于这个问题,bash有/ dev/stdout.

3> Paul Dixon..:

有一个漂亮的发球台!

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


greyfade的优秀答案显示了如何使用tee'd输出做你喜欢的事.

4> Joshua..:

只是发布一个不涉及触摸磁盘的方式:

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

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有