2009-02-20 66 views

回答

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

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

+0

_A_w_e_s_o_m_e_。谢谢。 – 2009-02-20 19:54:29

+3

在那里做什么/ dev/tty?原始问题需要标准输出的输出,而不是终端上的输出。 – 2009-02-20 20:29:46

+4

/dev/tty是当前终端的同义词。提问者以习惯的方式使用“标准输出”来表示当前的终端,而不是对该术语的更严格的定义。 – 2009-02-20 20:41:57

16

祝你有个不错的杯子tee

tee命令拷贝标准输入 到标准输出并且也作为参数给出任何 文件。这是 有用的,当你想不只是送 某些数据中,一个管道,还要 保存副本

正如我有一个缓慢的下午,这里的有些夸张说明ASCII艺术...

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

另一种方法(假设像bashzsh壳):

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

诚然奇怪>()语法基本上具有下列功能:

  • 创建新的FIFO(通常是一些在/tmp/
  • ()和b中执行命令将FIFO指定给该子命令上的stdin
  • 将FIFO文件名返回给命令行。

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

tee /tmp/arjhaiX4 

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

对于Bash,详见man bash。它在redirection的部分。对于Zsh,请参阅man zshexpn,标题为“过程替代”。据我所知,Korn Shell,经典的Bourne Shell(包括灰和破折号)和C Shell的变体不支持这种语法。

6

刚刚发布的方式,不涉及接触磁盘:

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