使用 tail 时抑制“文件截断”消息

使用 tail 时抑制“文件截断”消息

我正在使用尾部日志文件tail -f messages.log,这是输出的一部分:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Fusce eget tellus sit amet odio porttitor rhoncus. 
Donec consequat diam sit amet tellus viverra pellentesque. 
tail: messages.log: file truncated
Suspendisse at risus id neque pharetra finibus in facilisis ipsum.

它显示tail: messages.log: file truncated文件何时被自动截断,这应该会发生,但我只想tail显示没有此截断消息的输出。

我尝试过使用tail -f messages.log | grep -v truncated,但它还是向我显示了该消息。

有什么方法可以抑制此消息吗?

答案1

该消息输出于标准错误像所有警告和错误消息一样。

您可以删除所有错误输出:

tail -f file 2> /dev/null

或者仅过滤掉包含以下内容的错误消息truncate

{ tail -f file 2>&1 >&3 3>&- | grep -v truncated >&2 3>&-;} 3>&1

但这意味着您将失去 的退出状态tail。一些 shell 有一个pipefail选项(使用 启用)让该管道在失败时set -o pipefail报告退出状态。并且还可以在其/数组中报告管道各个组件的状态。tailzshbash$pipestatus$PIPESTATUS

通过zshbash,您可以使用:

tail -f file 2> >(grep -v truncated >&2)

但请注意,不会等待该命令,因此可能会在退出并且 shell 已经开始运行脚本中的下一个命令grep后最终显示错误消息(如果有) 。tail

在 中zsh,您可以通过编写以下内容来解决这个问题:

{ tail -f file; } 2> >(grep -v truncated >&2)

zsh文档中对此进行了讨论info zsh 'Process Substitution'

还有一个额外的问题>(PROCESS);当它附加到外部命令时,父 shell 不会等待 PROCESS 完成,因此紧随其后的命令不能依赖结果的完成。问题和解决方案与章节中描述的相同多重注意重定向::。因此,在上面示例的简化版本中:

paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)

(请注意,不涉及 MULTIOS),就父 shell 而言,PROCESS 将异步运行。解决方法是:

{ paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)

这里的额外进程是从父 shell 中生成的,父 shell 将等待其完成。

答案2

发生这种情况是因为文件内容

被覆盖覆盖>- 不添加附加>>

答案3

如果grep不删除输出,它很可能会打印在标准错误上。摆脱它的最简单方法就是简单地转储它:

tail -f messages.log 2>/dev/null

相关内容