我刚刚运行了一项需要几个小时的工作,但我忘记将该文本通过管道传输到文本文件中。
伪代码:
echo [previous text output] > OutputHistory.txt
此外,我不能只是“复制并粘贴”终端中的内容,因为 1)显示省略了重要的格式字符,如“\t”,2,我可能已经关闭了终端窗口。
这可以用任何 Unix 命令实现吗?
答案1
这一般来说是不可能的。一旦应用程序发出一些输出,存储该输出的唯一位置就是终端的内存中。举一个极端的例子,如果现在是 20 世纪 70 年代,终端是硬拷贝打印机,那么如果没有人输入,输出就不会返回计算机。
如果输出仍在终端模拟器的滚动缓冲区中,您也许可以将其取回,但如何执行此操作取决于终端,没有标准方法。此时制表符可能已转换为空格,也可能尚未转换为空格。是否可以检索格式信息(颜色、粗体等)以及以什么格式检索取决于终端。对于大多数终端,没有简单或万无一失的方法来查找命令输出的开始和结束位置。
如果您提前计划,您可以使用透明方式记录命令的输出script
。运行script mycommand.log mycommand
可能与 不同,mycommand 2>&1 | tee mycommand.log
因为使用 时script
,命令仍在写入终端。
一种折衷方案是始终在screen
或内运行长期存在的命令tmux
。两者都有一种将回滚缓冲区转储到文件的方法,并且它们还有一个额外的好处,即您可以在不中断程序执行的情况下与会话断开连接,然后重新连接。
答案2
仅当终端应用程序将原始输出存储到某处的文件中(例如iTerm
启用日志记录时),或者某些其他日志记录应用程序(autoexpect(1)
或等效程序)正在保存输出时,原始输出才可用。通常这必须提前设置,并且需要管理,例如,如果有人离开yes
运行一段时间,那么磁盘空间到哪里去了?