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

Nat*_*ver 5 logs terminal readline tee units

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

我尝试过tee 这样使用:

units | tee units.log
Run Code Online (Sandbox Code Playgroud)

或这样的脚本:

script -c units units.log
Run Code Online (Sandbox Code Playgroud)

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

You have: 55 horsepower ^G/^H^[[K^M
You want: wat^Gt ^M
    * 41013.493^M
    / 2.438222e-05^M
Run Code Online (Sandbox Code Playgroud)

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

错误

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

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

/sf/ask/500663761/

以及这里的 perl 脚本:

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

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

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

错误和限制

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

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

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

units | col -b | tee units.log
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*ver 1

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

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

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