使用history
能够查看当前用户最近执行的HISTSIZE
条命令,这些记录被存储在HISTFILE
文件中,在bash
启动时会自动加载到历史记录缓冲队列,其简单使用方法以下:shell
> history # 显示所有历史记录 1 ip a 2 exit 3 ls -la 4 history > history 2 # 显示最后两条历史记录 4 history 5 history 2
使用Ctrl + R
快捷键能够进入历史记录搜索模式,根据用户输入的字符按照最近最类似原则将搜索结果打印到命令提示符后面,输入回车能够直接执行这条结果。另外一种方式是使用grep
配合管道进行批量搜索:安全
> history | grep ffmpeg | grep gif | grep yuv444p 119 ffmpeg -y -f gif -i 79557166.gif -c:v libx264 -vf format=yuv444p yuv444p.mp4 120 ffmpeg -y -f gif -i 79557166.gif -c:v libx264 -vf format=yuv444p yuv444p.mkv
使用!!
可以当即执行历史记录中的最后一条命令,也就是重复上一条命令;使用![number]
可以根据number
执行对应编号的历史命令;使用![string]
可以根据string
按照最近最类似原则执行历史命令。这类命令最人性化的是会在执行前打印要执行的命令(让你知道系统是怎么挂的)。bash
> date Sun 23 Feb 2020 06:18:16 PM CST > !! # 不安全 date Sun 23 Feb 2020 06:18:18 PM CST > !907 # 危险 make make: \*\*\* No targets specified and no makefile found. Stop. > !shut # 很是危险 shutdown now
经过!
开头的命令直接执行对应的历史记录是十分危险的,尤为是在高权限用户环境下,所以建议在执行以前经过如下方式查看对应的命令:服务器
> !!:p #查看记录中最后一条命令 > !123:p #查看记录中第123条命令 > !sys:p #查看记录中sys开头的最近一条命令
使用history -d <hist_num>
能够删除指定序号的历史记录,该模式只接收一个参数,其余参数会被忽略,利用这一特性能够实如今bash中执行不被记录的命令。session
> echo "secret command";history -d $(history 1) secret command
若是你想彻底清除当前会话内的使用痕迹,能够使用history -c
清空历史记录缓冲队列,值得注意的是这个命令不会清空历史记录文件。app
[warning]
注意:除了上述方法外,用户还能够经过
unset HISTFILE
直接取消历史记录功能,这对服务器的平常维护来讲是十分危险的。
在退出终端时bash会自动将当前会话中执行过的命令写入历史记录文件中,默认写入方式为覆盖。你也能够经过-w
和-a
模式将当前会话中的命令手动写入文件中:spa
> history -w # 缓冲队列覆盖写入文件 > history -a # 当前会话的命令追加写入文件
以Ubuntu 20.04 LTS
为例,默认状况下历史记录相关的环境变量被定义在~/.bashrc
文件中。code
经过修改HISTTIMEFORMAT
变量能够对历史记录添加时间戳,%F
表明日期,%T
表明时间。orm
> export HISTTIMEFORMAT='%F %T ' > echo 'history with time' > history 1 1032 2020-02-23 17:01:26 history
经过修改HISTCONTROL
变量能够控制history
的记录策略,以下表所示:队列
可选值 | 记录策略 |
---|---|
ignoredups | 默认,不记录连续的相同命令 |
ignorespace | 不记录空格开头的命令 |
ignoreboth | ignoredups 和 ignorespace 的组合 |
erasedups | 不记录重复的命令 |
咱们还能够经过设置HISTIGNORE
变量指定要忽略的命令,命令之间用:
分隔:
> echo 'export HISTIGNORE="ls:cd"' >> ~/.bashrc > source ~/.bashrc
当前用户的历史记录默认存储到~/.bash_history
文件中,能够经过修改HISTFILE
变量改变历史记录存储的位置。
> echo 'export HISTFILE="<new_histfile_path>"' >> ~/.bashrc > source ~/.bashrc
变量HISTSIZE
决定了使用history
时显示的记录数量,其默认值为1000
。
> echo $HISTSIZE 1000 > HISTSIZE=200 # 仅针对当前会话生效 > sed -i 's/^HISTSIZE=1000/HISTSIZE=200/' ~/.bashrc # 永久生效 > echo $HISTSIZE 200
变量HISTFILESIZE
定义了存储在文件中的历史命令总数,默认值为2000
。历史记录的存储方式相似于队列,bash
初始化时会将HISTFILE
文件中存储的全部历史记录加载到内存中,以队列的形式存储,用户在使用过程当中产生的命令也会被添加到队列中,每次用户调用history
都会显示最近的HISTSIZE
条记录。
在终端退出时会将当前会话(session)中产生的记录写入到文件中,为了防止同时开启多个终端致使历史记录丢失,建议在~/.bashrc
文件中添加shopt -s histappend
,让终端在退出时将当前会话产生的历史记录追加写入到HISTFILE
文件中。
[warning] 注意:默认状况下的历史记录写入方式为覆盖,例如:开启终端A -> 开启终端B -> 关闭终端A -> 关闭终端B,这个操做序列会致使终端A在运行过程当中产生的历史记录所有丢失。
断电、非法关机等特殊状况会让bash
没法正常结束,进而致使当前会话的历史记录丢失。能够在~/.bashrc
文件中添加如下内容实现自动追加写入每条命令:
PROMPT_COMMAND=”history -a”
在bash
的配置文件中,若是设置了PROMPT_COMMAND
环境变量,则在每次显示命令提示符(例如:remilia@CT7GK:~$
)以前,该变量的值将被做为命令执行,这里咱们设置为自动执行执行history -a
,将历史记录追加写入到文件中。