有没有办法让终端会话在重启时保持不变?

OS X有这个。 理想情况下,我希望重新启动看起来好像从未发生过终端的POV(让我们忽略远程会话并假设现在有0个后台进程)。 意思是,我希望在每个终端选项卡中看到stdin,stdout,stderr(即回滚)历史记录。

注意:这不是关于bash历史记录。 这是关于在重新启动之间持久的终端会话。

不,至少在gnome-terminal和其他基于VTE的仿真器中,以隐式和方便的方式是不可能的。

(当然,您可以在重新启动之前明确地浏览所有选项卡,“全选”并将内容复制粘贴到文件中,并在重新启动后使用某些查看器查看这些文件。如果我理解您,这不是什么你正在寻找。此外,颜色和其他格式将丢失。)

VTEgnome-terminal和许多其他终端仿真器后面的终端仿真小部件默认情况下将大部分回滚内容(不是最新的位)存储在/tmp下的临时文件中。 阻止您正在寻找的主要设计决策是:

  • 这些文件在创建后立即取消链接。 这样即使终端仿真器因任何原因不正常地退出,它们也会被自动删除(并释放磁盘空间)。 为了保留它们,它们应该链接回文件系统树(我不知道是否可能)或者复制到另一个文件中(如果回滚很大,这是一个很慢的动作,更不用说正确处理可能用完了磁盘空间)。

  • 这些文件位于/tmp之下,重启后会被许多发行版消灭。 应该选择不同的持久性位置,或者需要与引导脚本进行一些协作。

  • 这些文件是加密的(从VTE版本0.40开始),以便在有人访问磁盘时克服数据泄漏的隐私问题。 加密密钥仅在gnome-terminal的内存中可用。 为了保持这些文件的持久性,应该跳过加密层(恢复旧的隐私问题),或者在重启期间至少暂时将密钥放在磁盘上(…呃,直到用户再次登录并再次启动gnome-terminal …声音听起来不太好)。 只有在您不关心隐私或文件系统保证加密的情况下才可行。

还有其他一些较小的问题需要解决,例如刷新包含回滚数据最后几位的这些文件的不完整块。

我希望我可以概述VTE采取的一些设计决定,以防止你正在寻找你正在寻找的东西。 在保持当前的设计目标的同时,我无法看到您的请求如何得到解决。 也许还有另一个终端模拟器可以满足您的需求,可能会牺牲一些VTE的function; 我不知道。

我建议使用非常有用的screen工具。 这非常值得学习。 总结一下我在另一个问题上提出的答案:

请参阅.screenrc,您可以使用自定义命令启动默认窗口,以便在希望恢复不同会话时使用不同的.screenrc文件恢复会话。 screen -t ....请参阅gnu.org屏幕手册 – 启动文件

使终端会话持续存在的一个好方法是在服务器上运行“屏幕”会话。 “屏幕”会话为您提供了多个窗口,您可以在该服务器上登录其他计算机或其他任何机器。 您可以在服务器上运行多个“屏幕”会话。 您可以断开连接并重新连接到所需的会话。 ‘screen’是老式的命令行键盘,但非常值得学习和玩,以了解它是如何工作的。 它有一些很大的优点:

  • 易于安装,可在任何unix(或cygwin)上运行,无需图形(除了终端文本图形)
  • 给出持久的窗口终端会话(只要服务器没有重启)

*屏幕快速入门*

RTFM: gnu.org屏幕用户手册

  • 屏幕 – 运行屏幕以简单地创建新会话
  • screen -ls – 列出正在运行的屏幕会话
  • screen -r 20229.pts-2.bangor – 重新连接到会话

*屏幕ESCAPE char默认为Ctrl-a *,除非某些疯狂的looper在.screenrc中更改了它,例如对于不重视进程后台控制的人来说,“escape ^ Zz”。 如果在屏幕上运行,要获得真正的Ctrl-a到终端(转到行首),只需按Ctrl-a Ctrl-a。

  • ESCAPE c – 创建新的屏幕窗口
  • ESCAPE 0(或1 2 3 4 5 6 7 8 9) – 切换到窗口0(或1 2 ..)
  • ESCAPE p或ESCAPE n – 切换到上一个或下一个窗口
  • ESCAPE“ – 窗口列表
  • ESCAPE h – 显示屏幕帮助

在这里我已经在另一个问题中提到了屏幕帮助页面,命令行用法和示例.screenrc的示例:

具有“恢复会话”function的终端仿真器,如Mac终端