有没有某种方法可以使用命令将所有终端输出保存到文件中?
- 我不是在谈论重定向
command > file.txt
- 不是历史记录
history > file.txt
,我需要完整的终端文本 - 不是用热键!
就像是terminal_text > file.txt
答案1
您可以使用script
。它基本上会保存该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
.
如果需要,您可以保存当前会话日志事后 (在会议结束时)通过键入savelog
或savelog 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+Print或Shift+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。
将打开一个文件管理器,允许您选择保存包含屏幕缓冲区输出的文件的位置。