中止脚本重放会弄乱我的终端。如何撤消并潜在地防止?

中止脚本重放会弄乱我的终端。如何撤消并潜在地防止?

我使用 命令记录了一个长时间运行的命令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,如果缺少则将其添加到路径中。

相关内容