记录交互式输入和输出,而不捕获所有键入的输入和控制字符

记录交互式输入和输出,而不捕获所有键入的输入和控制字符

我正在尝试记录交互式命令行程序的输出;units, 具体来说。

我尝试过tee 这样使用:

units | tee units.log

或这样的脚本:

script -c units units.log

但它们都将所有退格键和制表符补全记录为特殊字符,如下所示:

You have: 55 horsepower ^G/^H^[[K^M
You want: wat^Gt ^M
    * 41013.493^M
    / 2.438222e-05^M

的联机帮助页script提到了这个问题。

错误

脚本将所有内容放入日志文件中,包括换行符和退格键。这不是天真的用户所期望的。

我知道使用catmore/或剥离转义字符查看文件的解决方法,col如下所述:

https://stackoverflow.com/questions/7152339/format-output-from-unix-script-command-remove-backspaces-linefeeds-and-delet

以及这里的 perl 脚本:

http://log.guidoderosa.net/2009/05/another-old-post-which-may-be-useful.html

但我并不是特别想修复现有的日志文件:我想避免创建因删除的输入和控制字符而乱码的新日志文件。

我以为我已经使用 解决了问题rlwrap,但它与unitsreadline 功能冲突,因此它要么无法捕获输出,要么捕获输出但否定使用制表符完成rlwrap -a的能力。没有帮助。这在手册页中有详细记录:unitsrlwrap -a -N

错误和限制

尽管 rlwrap 很灵活,可以交付货物(readline 功能),并且遵循 Unix“许多小工具”范例,但它是一个拼凑品。它无法了解有关命令内部状态的任何信息,这使得上下文相关的完成变得不可能。在命令中使用 readline 库仍然是最好的选择。

有没有什么方法可以干净地记录交互式输入和输出,而又不会干扰现有readline功能?

更新:我会对类似的事情感到高兴

units | col -b | tee units.log

但在等待交互式输入时会挂起。这个问题可以解决吗?

答案1

GNU Units 最近在 2.10 版本中添加了此功能。

--log选项允许您将计算结果保存在文件中;如果您需要永久记录您的工作,这会很有用。

https://www.gnu.org/software/units/manual/units.html#Logging-Calculations

相关内容