我使用 命令记录了一个长时间运行的命令script
,并希望使用 重播该命令scriptreplay
。在看到我想要看到的内容后,我使用Ctrl+ C(又名SIGINT
) 中止了该命令,现在换行符和类似的东西严重混乱:
$ script --help
Usage:
script [options] [file]
Make a typescript of a terminal session.
Options:
-I, --log-in <file> log stdin to file
-O, --log-out <file> log stdout to file (default)
-B, --log-io <file> log stdin and stdout to file
-T, --log-timing <file> log timing information to file
-t[<file>], --timing[=<file>] deprecated alias to -T (default file is stderr)
-m, --logging-format <name> force to 'classic' or 'advanced' format
-a, --append append to the log file
-c, --command <command> run command rather than interactive shell
-e, --return return exit code of the child process
-f, --flush run flush after each write
--force use output file even when it is a link
-E, --echo <when> echo input in session (auto, always or never)
-o, --output-limit <size> terminate if output files exceed size
-q, --quiet be quiet
-h, --help display this help
-V, --version display version
For more details see script(1).
%
我像这样运行命令:script -B command.log -T command.log.time -eq -c "command"
然后像这样重播它scriptreplay -t command.log.time -B command.log -d 2
那么我该如何解决这个问题?我该如何彻底结束会话scriptreplay
而不发生这种情况?
答案1
发生这种情况是因为脚本尝试重播会话非常忠实,包括移动光标和更改各种终端内部结构。如果您要禁用忠实的再现(不确定是否支持),其输出看起来会很糟糕。
相反,你可以将 scriptreplay 包装在 shell 脚本中,以将终端恢复到已知良好状态:
#!/usr/bin/env bash
_restore () {
trap SIGINT
reset -I
exit
}
trap _restore INT
scriptreplay "$@"
并将该脚本放置在(例如)处~/.local/bin/scriptreplay-fixed
,如果缺少则将其添加到路径中。