0.需求
复现一篇代码的时候,原代码频繁的使用print,而不是logging,交互信息全部都只在控制台显示,懒得对代码的每个print作修改,但做实验期间又需要保留一些过程性数据,因此实现将输出同步保存到日志,方便日后数据分析。
个人比较偏好script方法,语法简单且可以一次记录多条指令的输出,其他方法可以移步:如何将 Linux 终端中命令的输出保存到文件中 | Linux 中国 - 知乎 (zhihu.com)
1.script
一个大概介绍:script命令启动一个shell,并将所有输出重定向到一个文件中。这个文件记录了会话的开始和结束时间,以及在会话期间执行的所有命令和产生的输出。
2.基本使用
开始记录:使用以下命令开始记录会话,会创建一个名为output_name.log的文件,并将之后的所有终端输出保存到这个文件中。
script output_name.log
记录期间:当终端输出Script started, file is output_name.log时,会话就开始记录了。在script命令启动的 shell中,可以执行任何命令,就像在普通的终端会话中一样。所有输出都会被记录到该指定的日志文件中。
结束记录:输入exit或按Ctrl-D来结束script命令。这会关闭日志文件并保存到目前为止的所有输出
【即使在执行exit之前强制关闭了终端或者SSH连接断开了,script通常也会将到目前为止的会话输出保存到日志文件中。这是因为script在后台运行,会捕捉到会话结束之前的所有输出。】
3.常见其他用法
3.1 追加到日志文件 -a
默认情况下,对于已经存在的output_name.log,再次写入会覆盖之前的日志信息。如果需要将新的会话输出追加到现有的日志文件中,而不是覆盖它,添加-a选项即可:
script -a output_name.log
3.2 日志添加时间戳 -t
script -t output_name.log
3.3 指定终端类型
终端类型定义了终端如何显示文本、处理颜色、响应特殊按键等。指定终端类型,主要是为了确保记录的会话能够正确地处理特殊字符和控制序列。
默认情况下,script通常会使用当前会话的TERM环境变量值来确定终端类型。
查看当前的TERM值:
echo $TERM
如果终端类型不对,有两种方法:
【临时设置】命令行中临时设置TERM环境变量,以xterm为例,只会影响到当前会话:
TERM=xterm script output_name.log
【全局设置】直接修改环境变量值
export TERM=xterm