我正在使用尾部日志文件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
报告退出状态。并且还可以在其/数组中报告管道各个组件的状态。tail
zsh
bash
$pipestatus
$PIPESTATUS
通过zsh
或bash
,您可以使用:
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