使用 tail 时禁止“文件截断”消息

Bas*_*ers 13 grep tail output

我正在使用尾随日志文件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.
Run Code Online (Sandbox Code Playgroud)

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

我试过使用,tail -f messages.log | grep -v truncated但它仍然向我显示消息。

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

Sté*_*las 21

该消息像所有警告和错误消息一样在stderr输出

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

tail -f file 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

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

{ tail -f file 2>&1 >&3 3>&- | grep -v truncated >&2 3>&-;} 3>&1
Run Code Online (Sandbox Code Playgroud)

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

使用zshbash,您可以使用:

tail -f file 2> >(grep -v truncated >&2)
Run Code Online (Sandbox Code Playgroud)

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

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

{ tail -f file; } 2> >(grep -v truncated >&2)
Run Code Online (Sandbox Code Playgroud)

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

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

paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)
Run Code Online (Sandbox Code Playgroud)

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

{ paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)
Run Code Online (Sandbox Code Playgroud)

这里的额外进程是从父 shell 产生的,它将等待它们完成。


BG *_*UNO 11

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

被 overwrite 覆盖>- 不被追加 添加>>