我想执行一个命令,让该命令的输出动态地获取gzip,并且还回显/发出该命令的输出。
,例如:
echo "hey hey, we're the monkees" | gzip --stdout > my_log.gz
除了行执行时,我想在标准输出中看到这个:
hey hey, we're the monkees
答案 0 :(得分:54)
另一种方式(假设像bash
或zsh
这样的shell):
echo "hey hey, we're the monkees" | tee >(gzip --stdout > my_log.gz)
公认的奇怪>()
语法基本上可以做到以下几点:
/tmp/
)()
内执行命令,并将FIFO绑定到该子命令上的stdin 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)