【问题标题】:No output from awk only when redirected to pipe or file [duplicate]仅当重定向到管道或文件时,awk 才没有输出[重复]
【发布时间】:2019-01-30 22:13:14
【问题描述】:

我有一个相当简单的脚本(在每行添加时间戳后从 tty 打印内容)。它在命令行上很好地输出,但用> 重定向输出不起作用。为什么不呢?

这是脚本:

#!/bin/bash
awk '{ print strftime("%Y-%m-%d %H:%M:%S |"), $0; }' "$1"

按原样运行,就像timecat /dev/ttyACM0 工作正常,我在终端中看到了内容。

但是,如果我运行 timecat /dev/ttyACM0 > ~/tmp.log,则什么也不会出现。与tee 相同。文件在那里,但它是空的。

脚本中的awk 有什么奇怪的地方,我该如何修改它以使重定向工作?

【问题讨论】:

  • 与您的问题无关,[[ $@ == -h ]] 不可靠。您不能将 listsingle item 进行比较并期望得到好的结果——shell 会将你的列表扁平化为字符串(导致比较结果不正确—— f/e, ls --help whatever 仍然打印帮助,但上面的代码不会,因为它将 "--help whatever" 视为单个字符串),或者单独传递它包含的项目(导致语法错误)。
  • 无论如何,如果您想知道运行时发生了什么,一个很好的起点是在启用跟踪日志记录的情况下运行。 bash -x timecat /dev/ttyACM0 >~/tmp.log 将向 stderr 发出脚本执行的跟踪信息,以便您了解发生了什么。这应该可以帮助您简化问题,使minimal reproducible example 没有与产生手头的狭窄行为无关的代码。将该日志作为问题的一部分添加也可以减少涉及猜测的答案。
  • (顺便说一句,当tty 变量为空时,所编写的代码将会失败,这可能会产生误导;如果引用所有变量引用,请使用"$tty" 而不是@ 987654337@,该值仍然会被传递,通常会导致更有意义和有用的错误消息。考虑使用shellcheck.net 来捕捉此类问题作为实践问题)。
  • 。您是否尝试在脚本仍在运行时检查输出(或监视来自tee 的结果),而不是让脚本退出(或收集至少约 32kb 左右的内容,通常足以触发刷新),然后再检查是否你有一个非空的输出文件?如果是这种情况,您可能只是被缓冲所困扰,这将使这与 BashFAQ #9 已经涉及的许多 SO 问题重复。
  • ...好吧,在进一步查看之后,stackoverflow.com/questions/8058831/awk-not-printing-to-file 实际上似乎是一个完全相同的副本(包括fflush() 作为已接受答案中的建议)。

标签: bash awk stdout


【解决方案1】:

所需要做的就是在命令中刷新打印,将最后一个脚本行替换为:

awk '{ print strftime("%Y-%m-%d %H:%M:%S |"), $0; fflush(); }' $tty
                                                  ^^^^^^^^^

【讨论】:

  • 我正在开发一个 bash 脚本,它调用 awk 程序文件中的函数;大多数使用 awk -f prgfile 输出的调用;对 5 个电话有效;不是6号。我在终端中运行该行并且它可以工作......在 bash 脚本中它没有。花了 3 个小时比较文件名字符串......然后用谷歌搜索并找到了这篇文章。这对我有用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 2020-05-08
  • 2021-03-17
  • 2014-03-08
  • 1970-01-01
相关资源
最近更新 更多