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


61

有什么方法可以通过命令将所有终端输出保存到文件中?

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

就像是 terminal_text > file.txt


一个可能的重复,无论如何,谢谢:)
ABcDexter

许多GUI终端仿真器都允许保存滚动缓冲区,但是命令无法访问滚动缓冲区(不考虑xdotool此类问题)。

1
尝试终端菜单->外壳->将文本导出为,例如:mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

Answers:


70

您可以使用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

要注销screen会话(停止保存内容),只需键入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以获取更多想法。


1
事实发生后可以调用吗?(即在会话结束时)还是必须在要记录的内容之前调用它?
声音

@ tjt263它要保存在内容之前被调用..
heemayl

4
该死的。真可惜 我通常不知道自己想要什么,直到后来。
声音

@ tjt263,您可以将其放在.bashrc中,并将所有内容附加到/ tmp中。
phil294

1
要追溯导出,请尝试终端菜单->外壳->将文本导出为,例如:mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

12

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

将以下内容添加到您的.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

完成此操作后,“脚本”命令将在每个终端会话中执行一次,并将所有内容记录到“〜/ Terminal_typescripts / raw”。如果需要,您可以在事件结束 (在会话结束时)输入“ savelog”或“ savelog logname” 来保存当前会话日志-这会将当前原始日志复制到“〜/ Terminal_typescripts / manual”并创建可读文件。 .txt登录到该文件夹​​。(如果忘记这样做,原始日志文件仍将保留在它们的文件夹中,只需找到它们即可。)此外,您还可以通过键入“ startnewlog”开始记录到新的日志文件中。

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

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


为什么开始记录后需要“退出”命令?
Danijel

好像在Mac OSX上从.bash_profile调用“ script”命令对外壳产生了一些奇怪的影响。您知道这是否适用于OSX吗?
Danijel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.