将所有终端输出保存到文件中

将所有终端输出保存到文件中

有没有某种方法可以使用命令将所有终端输出保存到文件中?

  • 我不是在谈论重定向command > file.txt
  • 不是历史记录history > file.txt,我需要完整的终端文本
  • 不是用热键!

就像是terminal_text > file.txt

答案1

您可以使用script。它基本上会保存该script会话中终端上打印的所有内容。

man script:

script makes a typescript of everything printed on your terminal. 
It is useful for students who need a hardcopy record of an 
interactive session as proof of an assignment, as the typescript file 
can be printed out later with lpr(1).

script只需script在终端中输入即可启动会话,所有后续命令及其输出都将保存在typescript当前目录中命名的文件中。您也可以通过以下方式将结果保存到不同的文件script

script output.txt

要注销会话script(停止保存内容),只需键入exit

这是一个例子:

$ script output.txt
Script started, file is output.txt

$ ls
output.txt  testfile.txt  foo.txt

$ exit
exit
Script done, file is output.txt

现在,如果我读取该文件:

$ cat output.txt

Script started on Mon 20 Apr 2015 08:00:14 AM BDT
$ ls
output.txt  testfile.txt  foo.txt
$ exit
exit

Script done on Mon 20 Apr 2015 08:00:21 AM BDT

script还有许多选项,例如安静运行-q--quiet)而不显示/保存程序消息,它还可以运行特定命令-c--command)而不是会话,它还有许多其他选项。查看man script以获得更多想法。

答案2

我也遇到了同样的问题,经过一番搜索后找到了这个解决方案:

添加到您的.bash_aliases

# Execute "script" command just once
smart_script(){
    # if there's no SCRIPT_LOG_FILE exported yet
    if [ -z "$SCRIPT_LOG_FILE" ]; then
        # make folder paths
        logdirparent=~/Terminal_typescripts
        logdirraw=raw/$(date +%F)
        logdir=$logdirparent/$logdirraw
        logfile=$logdir/$(date +%F_%T).$$.rawlog

        # if no folder exist - make one
        if [ ! -d $logdir ]; then
            mkdir -p $logdir
        fi

        export SCRIPT_LOG_FILE=$logfile
        export SCRIPT_LOG_PARENT_FOLDER=$logdirparent

        # quiet output if no args are passed
        if [ ! -z "$1" ]; then
            script -f $logfile
        else
            script -f -q $logfile
        fi

        exit
    fi
}

# Start logging into new file
alias startnewlog='unset SCRIPT_LOG_FILE && smart_script -v'

# Manually saves current log file: $ savelog logname
savelog(){
    # make folder path
    manualdir=$SCRIPT_LOG_PARENT_FOLDER/manual
    # if no folder exists - make one
    if [ ! -d $manualdir ]; then
        mkdir -p $manualdir
    fi
    # make log name
    logname=${SCRIPT_LOG_FILE##*/}
    logname=${logname%.*}
    # add user logname if passed as argument
    if [ ! -z $1 ]; then
        logname=$logname'_'$1
    fi
    # make filepaths
    txtfile=$manualdir/$logname'.txt'
    rawfile=$manualdir/$logname'.rawlog'
    # make .rawlog readable and save it to .txt file
    cat $SCRIPT_LOG_FILE | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > $txtfile
    # copy corresponding .rawfile
    cp $SCRIPT_LOG_FILE $rawfile
    printf 'Saved logs:\n    '$txtfile'\n    '$rawfile'\n'
}

并在文件末尾.bashrc添加以下内容:

smart_script

完成此操作后,“script”命令将在每个终端会话中执行一次,将所有内容记录到~/Terminal_typescripts/raw.

如果需要,您可以保存当前会话日志事后 (在会议结束时)通过键入savelogsavelog logname– 这会将当前原始日志复制到此文件夹~/Terminal_typescripts/manual,并在此文件夹中创建可读的 .txt 日志。 (如果您忘记这样做,原始日志文件仍将位于其文件夹中;您只需找到它们即可。)此外,您还可以通过键入 开始记录到新的日志文件startnewlog

会有很多垃圾日志文件,但是你可以不时清理旧的,所以这不是一个大问题。

(基于https://answers.launchpad.net/ubuntu/+source/gnome-terminal/+question/7131,https://askubuntu.com/a/493326/473790

答案3

在以下步骤中,xrdb ~/.Xressources修改 X-resources 文件后运行,然后打开新终端来测试更改。

XTerm

老鼠:抓住CtrlLeft-mouse-click。将显示“主选项”菜单。选择“立即打印全部”并释放。XTerm[date]已在您的主目录中创建包含终端内容的文件。

键盘快捷键:要将操作绑定到 CtrlShifty,请添加到您的~/.Xresources文件中:

XTerm*vt100.Translations: #override\
    Ctrl Shift <Key> y: print-immediate()

设置路径printFileImmediate设置转储文件的前缀。用于指定转储文件的路径。例如,要转储 /home/user/dumps/xt[date]文件,

XTerm*printFileImmediate: /home/user/dumps/xt

乌尔克斯夫特

键盘快捷键: 包括~/.Xresources

URxvt.print-pipe: cat > $HOME/scrollback

绑定到Ctrl+PrintShift+Print

其他终端

不是所有人都能做到;检查他们的手册页或菜单选项。

除此之外script,与终端无关的解决方案是使用多路复用器。

在 Tmux 中,只需运行其内部命令即可

capture-pane -S - ; save-buffer scrollback-file

.tmux.conf会将其绑定到Ctrl+bCtrl+s

bind C-s capture-pane -S - \; save-buffer $HOME/scrollback

答案4

对于 xfce4-terminal,请使用 accels.scm 文件。

例如,将 Ctrl-Shift-s 从“设置标题”重新分配为“保存内容”打开进行编辑:~/.config/xfce4/terminal/accels.scm

然后搜索“save-contents”并修改该行如下:

(gtk_accel_path "<Actions>/terminal-window/save-contents" "<Primary><Shift>s")

    ; This will map 'save the entire scrollback buffer to a file' to the Left_Ctrl-Shift-s keystrokes.

; NOTE: commented lines start with a ;

xfce4-terminal 的菜单布局类似于上面的 mac 终端答案。在 xfce4 终端中选择“终端,保存内容..”或简单地使用 Left_Ctrl-Shift-s。

将打开一个文件管理器,允许您选择保存包含屏幕缓冲区输出的文件的位置。

相关内容