script命令可完整记录当前终端会话的所有输入、输出、错误、颜色及控制字符,默认生成typescript文件,支持指定文件名、追加模式(-a)、静默模式(-q)和时序记录(-t),退出用exit或ctrl+d。

直接用 script 命令就能完整保存当前终端会话的所有内容(包括你敲的命令、回显、报错、甚至颜色和控制字符),不需要事后拼凑或重跑命令。
用 script 记录整个终端会话
这是最贴近“把当前终端输出内容保存到文件”这个需求的方法——它不依赖命令是否已执行完,而是从启动那一刻起就捕获一切输入和输出。
-
script默认会创建一个叫typescript的文件,直接运行script output.txt就能指定文件名 - 执行后,你看到的终端行为完全不变:照常输入命令、查看结果、滚动翻页
- 退出会话时输入
exit或按Ctrl+D,script自动结束并保存 - 生成的文件是纯文本,但保留了 ANSI 转义序列(比如颜色),用
cat -v output.txt或支持渲染的编辑器(如less -R)才能正确查看颜色效果 - 如果中途想暂停记录,可用
script -q(quiet 模式),但更推荐直接开新终端做敏感操作,避免混入无关内容
> 和 >> 只捕获单条命令输出,不是“当前终端”
很多人误以为 ls > out.txt 能存下“当前终端里刚看到的内容”,其实它只保存 ls 这一条命令的 stdout,且不包含你之前输过的命令、提示符、交互过程。更关键的是:
- 错误信息(如
Permission denied)走stderr(文件描述符 2),>完全抓不到 - 如果命令输出含进度条、实时刷新(如
top -n1)、或需要交互(如vim),重定向会失败或内容错乱 - 无法回溯已经执行过的命令——除非你重新运行一遍并加重定向,但环境可能已变
为什么 2>&1 | tee 不适合“当前终端”场景
这种写法常见于管道链中,比如 make 2>&1 | tee build.log,但它有硬性前提:必须在命令执行前就组织好整条管道。对“已经开着的终端、想把刚才那几屏内容捞出来”完全无效。
-
tee只能处理它 stdin 收到的数据,不能读取终端缓冲区或历史滚屏 -
2>&1的位置很关键:写成| tee log.txt 2>&1是错的,因为2>&1此时绑定的是管道前的 stdout,不是原命令的 stderr;正确顺序是command 2>&1 | tee log.txt - 即使写对了,也只适用于**接下来要执行的命令**,不是“当前已显示的内容”
别忽略 script 的两个易错点
script 看似简单,但实际用错会导致文件空、乱码或漏内容:
- 别在已有
script会话里再嵌套一层script,否则嵌套层的输出会混进外层文件,且退出逻辑混乱 - 默认情况下,
script不记录键盘输入的回显(比如你输密码时的******),但会记录真实按键——所以别用它录含敏感输入的操作 - 如果终端窗口太窄,
script会按当前$COLUMNS截断长行,导致日志换行错位;可先运行stty cols 200扩宽再启script











