tee命令通过管道传递到grep中并重定向到文件

时间:2019-02-28 21:31:40

标签: bash tee

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

sdx <- sd(nd$x) * 2.5 + mean(nd$x)
sdx1 <- sd(nd$x) * -2.5 + mean(nd$x)


library(tidyverse)
nd %>% filter(x < sdx, x > sdx1) %>% .$x %>% hist

不幸的是,直到完成为止(例如,通过杀死sleep命令的ppid),文件(while true; do date; sleep 1;done) | tee out.out 2>&1 | grep ^[A-Z] >log.log 2>&1 & 为空,但文件log.log具有预期的内容。

  1. 我首先想了解发生了什么
  2. 我想解决这个问题。

1 个答案:

答案 0 :(得分: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 &

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