如何将标准输入压缩到文件中并将标准输入打印到标准输出?

发布于 2024-07-13 13:19:05 字数 281 浏览 8 评论 0原文

我想执行一个命令,将该命令的输出即时进行 gzip 压缩,并且还回显/tee 输出该命令的输出。

即,类似:

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

除了该行执行时,我想在标准输出上看到这一点:

hey hey, we're the monkees

I want to execute a command, have the output of that command get gzip'd on the fly, and also echo/tee out the output of that command.

i.e., something like:

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

Except when the line executes, I want to see this on standard out:

hey hey, we're the monkees

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

戈亓 2024-07-20 13:19:06

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

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

公认奇怪的 >() 语法基本上执行以下操作:

  • 创建新的 FIFO (通常是 /tmp/ 中的内容)
  • () 内执行命令并将 FIFO 绑定到该子命令上的标准输入
  • 将 FIFO 文件名返回到命令行。

那么,tee 最终看到的是这样的:

tee /tmp/arjhaiX4

所有 gzip 看到的是它的标准输入。

对于 Bash,请参阅 man bash 了解详细信息。 它位于重定向部分。 对于 Zsh,请参阅“进程”标题下的 man zshexpn代换。”

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

Another way (assuming a shell like bash or zsh):

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

The admittedly strange >() syntax basically does the following:

  • Create new FIFO (usually something in /tmp/)
  • Execute command inside () and bind the FIFO to stdin on that subcommand
  • Return FIFO filename to command line.

What tee ends up seeing, then, is something like:

tee /tmp/arjhaiX4

All gzip sees is its standard input.

For Bash, see man bash for details. It's in the section on redirection. For Zsh, see man zshexpn under the heading "Process Substitution."

As far as I can tell, the Korn Shell, variants of the classic Bourne Shell (including ash and dash), and the C Shell don't support this syntax.

待天淡蓝洁白时 2024-07-20 13:19:06
echo "hey hey, we're the monkees" | tee /dev/tty | gzip --stdout > my_log.gz

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

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

As pointed out in the comments, /dev/stdout might work better than /dev/tty in some circumstances.

羁〃客ぐ 2024-07-20 13:19:06

喝一杯漂亮的 T 恤

tee 命令复制标准输入
标准输出以及任何
作为参数给出的文件。 这是
当您不仅想发送时很有用
一些数据通过管道传输,而且还可以
保存副本

因为我度过了一个缓慢的下午,这里有一些精彩的说明性 ascii-art...

           +-----+                   +---+                  +-----+  
stdin ->   |cmd 1|    -> stdout ->   |tee|   ->  stdout  -> |cmd 2|
           +-----+                   +---+                  +-----+
                                       |
                                       v
                                     file

正如 greyfade 在另一个答案中演示的那样,“文件”不必是常规文件,但可以是 FIFO,让您可以通过管道传输该文件输出到第三个命令。

           +-----+                   +---+                  +-----+  
stdin ->   |cmd 1|    -> stdout ->   |tee|   ->  stdout  -> |cmd 2|
           +-----+                   +---+                  +-----+
                                       |
                                       v
                                     FIFO
                                       |
                                       v
                                    +-----+
                                    |cmd 3|
                                    +-----+

Have a nice cup of tee!

The tee command copies standard input
to standard output and also to any
files given as arguments. This is
useful when you want not only to send
some data down a pipe, but also to
save a copy

As I'm having a slow afternoon, here's some gloriously illustrative ascii-art...

           +-----+                   +---+                  +-----+  
stdin ->   |cmd 1|    -> stdout ->   |tee|   ->  stdout  -> |cmd 2|
           +-----+                   +---+                  +-----+
                                       |
                                       v
                                     file

As greyfade demonstrates in another answer the 'file' need not be a regular file, but could be FIFO letting you pipe that tee'd output into a third command.

           +-----+                   +---+                  +-----+  
stdin ->   |cmd 1|    -> stdout ->   |tee|   ->  stdout  -> |cmd 2|
           +-----+                   +---+                  +-----+
                                       |
                                       v
                                     FIFO
                                       |
                                       v
                                    +-----+
                                    |cmd 3|
                                    +-----+
小巷里的女流氓 2024-07-20 13:19:06

只是发布一种不涉及触摸磁盘的方法:

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

Just to post a way that doesn't involve touching disk:

echo "hey hey, we're the monkees" | (exec 1>&3 && tee /proc/self/fd/3 | gzip --stdout > my_log.gz)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文