tee命令用grep管道并重定向到文件

问题描述 投票:2回答:1

我想在bash中使用以下命令:

(while true; do date; sleep 1;done) | tee out.out 2>&1 | grep ^[A-Z] >log.log 2>&1 &

不幸的是,直到它完成(例如通过杀死睡眠命令的ppid),文件log.log为空,但文件out.out具有预期的内容。

  1. 我首先想了解发生了什么
  2. 我想解决这个问题。
bash tee
1个回答
1
投票

为了解决这个问题,你需要使grep行缓冲。这可能取决于实现,但在BSD grep(Mac OS X附带)中,您只需要将--line-buffered选项添加到grep

(while true; do date; sleep 1;done) | tee out.out 2>&1 | grep --line-buffered ^[A-Z] >log.log 2>&1 &

来自grep手册页:

--line-buffered
             Force output to be line buffered.  By default, output is line buffered when standard output is a terminal and block buffered otherwise.

您实际上可以通过输出到STDOUT来验证该行为:

(while true; do date; sleep 1;done) | tee out.out 2>&1 | grep ^[A-Z] 2>&1 &

在这种情况下,您不需要显式缓冲,因为这是默认值。但是,重定向到文件时,必须显式设置该行为。

© www.soinside.com 2019 - 2024. All rights reserved.