从打字稿重新构buildshell会话

有一些工具,如'脚本','屏幕','ttyrec',允许logging内容的会议。 通过devise这些工具logging在pty上显示的所有内容,包括控制字符。 但是,似乎没有解决scheme来删除控制字符,并显示logging的会话的转录本在用户看到。 即使重放程序似乎也不能正确处理多行命令。

我花了一些时间试图为打字稿做适当的parsing,得出结论,事实上在一般情况下是不可能的。 问题是现代terminal模拟器(终结者,xterm,rxvt)function自动换行和shell(bash,zsh)使用它。 事情对于交互式shell进程来说工作得很好,因为它能够保持与terminal的宽度同步,并根据需要调整光标位置。 不幸的是,“脚本”(也就是我所看不到的其他工具)并没有跟踪pty大小变化事件,而这些信息简直就会丢失。 结果是一个渲染打字稿的工具没有足够的信息,不能重构多行命令的外观。

我错过了什么吗? 有解决scheme吗?

我看到以下可能的解决scheme,但是它们都不容易也不完整:

  • 使用shell没有复杂的命令行编辑器(如bourne shell)
  • 总是运行'set -x'on(在bash中会产生大量乱七八糟的命令auto-completion)
  • 修补“脚本”(和“屏幕”)工具来loggingpty大小的变化(在Linux上它可以提供时间信息到stderr已经是合乎逻辑的在那里添加pty大小变化事件)
  • 想出一些狡猾的algorithm来parsing搞砸的打字稿。 例如,在多行命令编辑期间,shell在需要转到另一行时发送CR。 当用户提交命令时,它会发送CR + NL。 不幸的是bash在处理用户的一些Ctrl-U命令时也会发送CR。
  • 从另一个来源获取命令的文本(正在打印在打字稿中),例如从shell历史logging中获取。 但是这需要定制shellconfiguration文件脚本等。

在一般情况下,您需要以相同大小的terminal重放。

  • 你可以决定完全忽略它。 正如sendmoreinfo所述,您可以声明一个不支持任何这些function的TERM。 尽pipe如此,不要期望vimreadline能以你习惯的方式行事。

  • 您可以将它与转录本一起存储,并在重放时重新创build正确的大小( 例如 xterm -geometry [...] -e [...] ),但resize会打破一切。

  • 如果你关心这件事,想要完美的解决scheme,你可以自己实现!

    • 您可以通过处理SIGWINCH信号并使用ioctl(STDIN_FILENO, TIOCGWINSZ, [...])来让您的ttyrecloggingterminal大小及其更改。

    • 你的ttyplay将不得不照顾一个terminal本身,并代表它在一个terminal。 这很棘手,但幸运的是有几个项目已经在做这个,所以你可以重用一个完善的代码库。 例如, tmux出现在脑海中。