有什么方法可以通过命令将所有终端输出保存到文件中?
- 我不是在谈论重定向
command > file.txt
- 不是历史
history > file.txt
,我需要完整的终端文本 - 不能用热键!
就像是 terminal_text > file.txt
xdotool
此类问题)。
有什么方法可以通过命令将所有终端输出保存到文件中?
command > file.txt
history > file.txt
,我需要完整的终端文本就像是 terminal_text > file.txt
xdotool
此类问题)。
Answers:
您可以使用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
以获取更多想法。
我也面临着同样的问题,经过一番搜索后,我想到了这个解决方案:
将以下内容添加到您的.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/7131,https://askubuntu.com/a/493326/473790)