【发布时间】: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 ]]不可靠。您不能将 list 与 single 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()作为已接受答案中的建议)。