菜鸟科技网

linux script命令如何记录终端操作?

script 命令是一个非常实用且经典的工具,它的核心功能是将终端(或伪终端)中所有的输入和输出都记录到一个文件中,这对于记录操作过程、生成教程、捕获调试信息或者与他人分享你的操作步骤非常有帮助。

linux script命令如何记录终端操作?-图1
(图片来源网络,侵删)

基本用法

最简单的用法就是直接在命令后跟上你想保存记录的文件名。

script my_session.log

执行这条命令后,你的终端会进入一个新的 script 会话,从这一刻起,你在终端中输入的每一个命令、以及命令的每一个输出(包括错误信息),都会被实时追加到 my_session.log 文件中。

当你想结束记录时,只需要输入 exit 命令,或者按下 Ctrl+D 快捷键,你就可以回到原来的终端会话中。

示例流程:

linux script命令如何记录终端操作?-图2
(图片来源网络,侵删)
# 1. 开始记录
$ script my_session.log
Script started, file is my_session.log
# 2. 执行一些命令
$ ls -l
total 8
-rw-r--r-- 1 user user 1234 Oct 26 10:30 my_session.log
-rw-r--r-- 1 user user 5678 Oct 26 10:31 my_script.sh
$ echo "Hello, this is a test."
Hello, this is a test.
$ pwd
/home/user
# 3. 结束记录
$ exit
exit
Script done, file is my_session.log
# 4. 检查生成的文件
$ cat my_session.log
Script started on 2025-10-26 10:30:15
$ ls -l
total 8
-rw-r--r-- 1 user user 1234 Oct 26 10:30 my_session.log
-rw-r--r-- 1 user user 5678 Oct 26 10:31 my_script.sh
$ echo "Hello, this is a test."
Hello, this is a test.
$ pwd
/home/user
$ exit
Script done on 2025-10-26 10:32:20

常用选项

script 命令提供了一些非常有用的选项来控制其行为。

-a--append

默认情况下,script 会覆盖指定的输出文件,如果你想在已有文件的基础上追加内容,而不是覆盖它,可以使用 -a 选项。

# 第一次记录
script -a session.log
# ... 执行一些命令 ...
exit
# 第二次记录,内容会追加到 session.log 的末尾
script -a session.log
# ... 执行另一些命令 ...
exit
# 查看文件,会发现两次记录的内容都在
cat session.log

-c--command

这个选项允许你直接执行一个命令,并将其输出记录下来,而不是启动一个交互式的 shell,这在自动化脚本中非常有用。

# 执行 `ls -l` 并将结果记录到 output.txt
script -c "ls -l" output.txt
# 查看 output.txt
cat output.txt
Script started on 2025-10-26 10:35:00
total 8
-rw-r--r-- 1 user user 1234 Oct 26 10:30 my_session.log
-rw-r--r-- 1 user user 5678 Oct 26 10:31 my_script.sh
Script done on 2025-10-26 10:35:01

可以看到,它只记录了 ls -l 命令的输出,没有进入交互式会话。

linux script命令如何记录终端操作?-图3
(图片来源网络,侵删)

-e--return

这个选项会记录命令的退出码,这对于调试脚本非常有用,可以知道每个命令是否成功执行。

# 执行一个会失败的命令和一个成功的命令
$ script -e error_demo.log
Script started, file is error_demo.log
$ ls /non_existent_dir
ls: cannot access '/non_existent_dir': No such file or directory
$ echo "This is fine."
This is fine.
$ exit
exit
Script done, file is error_demo.log
# 查看文件,你会看到 "Command exited with status 127" 这样的记录
$ cat error_demo.log
Script started on 2025-10-26 10:40:00
$ ls /non_existent_dir
ls: cannot access '/non_existent_dir': No such file or directory
Command exited with status 127
$ echo "This is fine."
This is fine.
Command exited with status 0
Script done on 2025-10-26 10:41:05

-f--flush

默认情况下,输出是先缓存在内存中,直到 script 会话结束才会一次性写入文件,如果记录一个非常长的会话,可能会因为意外中断(如断电、终端关闭)而导致数据丢失。-f 选项可以让 script 实时地将数据写入文件,确保数据安全。

script -f session.log
# ... 执行长时间任务 ...
# 即使终端意外关闭,session.log 中也已经记录了之前的内容

-q--quiet

安静模式,使用此选项后,script 启动和结束时的提示信息("Script started...", "Script done...")将被隐藏。

script -q quiet_session.log
# ... 执行命令 ...
exit
# 文件中不会有 "Script started" 或 "Script done" 字样
cat quiet_session.log

-t--timing

这个选项会记录每个输入输出事件发生的时间戳,生成的文件不仅包含内容,还包含了时间信息,这对于分析性能或重现事件顺序非常有用。

生成的文件格式是 timestamp:content

script -t timing_session.log
# ... 快速输入一些命令 ...
exit
# 查看文件,你会发现每行前面都有时间戳
cat timing_session.log

高级用法:使用 scriptreplay 回放

如果你在记录时使用了 -t 选项,那么恭喜你,你可以使用 scriptreplay 命令来“回放”你的操作过程!这对于制作教学视频或重现问题场景非常有帮助。

scriptreplay 需要两个文件:

  1. 包含时间戳的日志文件(由 script -t 生成)。
  2. 一个“原始”的输入文件(script 默认不生成,需要通过 -t 的输出重定向来获取)。

如何正确生成用于回放的文件:

# 1. 运行 script,将时间戳输出重定向到 timing_file,主输出重定向到 typescript_file
# 注意:`-t` 选项会将时间戳打印到标准错误,所以我们需要用 2> 来重定向它
script -t 2> timing_file typescript_file
# 2. 在新的会话中执行一些命令
$ date
Wed Oct 26 10:45:00 CST 2025
$ echo "Hello world"
Hello world
$ sleep 2
$ whoami
user
$ exit
# 3. 回放记录
# -t 指定时间戳文件
# -s 指定输入文件
scriptreplay -t timing_file -s typescript_file

执行 scriptreplay 后,你的终端会以与原来几乎相同的速度,逐字逐句地重新播放你刚才的操作,包括命令的输出和执行之间的延迟。


实际应用场景

  1. 记录复杂操作:当你需要执行一系列复杂的、容易出错的命令时,先用 script 记录下来,如果中间出错,可以直接查看日志,而不需要凭记忆回忆每一步。
  2. 编写教程:在编写 Linux/Shell 教程时,使用 script 可以完美地捕获命令和输出,确保教程的准确性。
  3. 技术支持与调试:当你在向技术支持人员或同事描述一个问题时,可以提供一个 script 记录,让他们能完整地看到你的操作环境和命令执行过程,这比文字描述要清晰得多。
  4. 自动化任务日志:结合 -c 选项,可以在自动化脚本中捕获命令的详细输出,便于后续审计和排错。
  5. 面试或演示:在进行技术面试或产品演示前,可以先录制好操作流程,确保演示的流畅性。
选项 全称 描述
-a --append 到已存在的文件,而不是覆盖。
-c --command 执行指定的命令并记录输出,不进入交互式 shell。
-e --return 记录每个命令的退出状态码。
-f --flush 实时将数据写入文件,而不是在会话结束时写入。
-q --quiet 静默模式,不显示 "Script started/done" 信息。
-t --timing 记录每个事件的时间戳,可用于回放。

script 命令是 Linux 工具箱中一个简单但功能强大的成员,熟练掌握它能极大地提高你的工作效率和问题排查能力。

分享:
扫描分享到社交APP
上一篇
下一篇