【问题标题】:log console output where the same line is being updated记录更新同一行的控制台输出
【发布时间】:2019-01-15 15:36:15
【问题描述】:

我正在运行一个在启动时更新同一行的应用程序:

1 of 1,000,000 
200 of 1,000,000 
300 of 1,000,000 

但以上内容仅在一行中。

每次更新光标时,我都想将其写入日志文件,以便观察更新之间的持续时间。

此命令似乎适用于在同一行上数字开始递增之前输出到控制台的行,但不记录数字更新。

command |& tee >(ts "%d-%m-%y %H_%M_%S" > play.log)

有什么技巧可以记录更新时的状态屏幕以及时间戳吗?

【问题讨论】:

  • 程序是写到/dev/tty,还是写到stdout/stderr,然后用回车把光标移回来?
  • 问问题有点不同:当您将 stdout 和 stderr 都通过管道传输到 tee 时,它甚至不会更新 到屏幕 (这意味着它正在检查isatty() 并根据结果决定是否记录临时更新),还是更新到屏幕但不附加到日志(这意味着它直接写入 /dev/tty 从而绕过您的重定向)?

标签: linux shell


【解决方案1】:

您可以使用tail 跟踪文件的更改,如果您想使用自定义输入作为内容前缀,您可以使用xargs,例如:

$ tail -F file | xargs -I@ date +"%d-%m-%y %H_%M_%S --> @"

或者传递你的命令的输出:

$ echo "foo" | xargs -I@ date +"%d-%m-%y %H_%M_%S --> @"
11-08-18 15_53_53 --> foo

【讨论】:

  • xargs 不会在具有$'\r' 但没有$'\n' 的序列上触发,这在一行被就地覆盖(“在单行",正如 OP 所说)。每行调用一次date 真的,真的很慢;一旦你到达了你实际挑选线路的地方,如果 bash 4.3 或更新版本可用,你将使用printf '%(...)T -> %s\n' -1 "$line" 获得更好的性能特征。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 2011-02-23
  • 1970-01-01
相关资源
最近更新 更多