Bash 通过上下键更有效的查找历史命令

我们知道在 bash 里,可以通过 “上下” 键来浏览最近执行过的命令历史纪录(history),我们也知道如果历史纪录太多的话可以通过 ctrl+r 来查找命令或者通过 history 命令来浏览历史命令。我们不知道的是(也许只有本人不知道~),还有一种神奇的办法可以更准确、有效的在历史命令纪录中查找自己想要的命令。

在自己的用户主目录(home directory)新建一个 .inputrc 文件:

$ vi ~/.inputrc
"\e[A": history-search-backward
"\e[B": history-search-forward
set show-all-if-ambiguous on
set completion-ignore-case on

退出 bash 后重新登陆,敲打一个字母或者几个字母,然后 “上下” 键,就会看到以这个字母搜索到的完整命令行。如果搜索到几个类似命令,通过上下键来切换,有点像 ctrl+r,但是更好用。

定期清理和保留 history 记录

有经验的 Linux 系统管理员都喜欢把 Bash 的 HISTSIZE/HISTFILESIZE 设置的很大,这样可以记录更多的历史命令以便以后查阅,这是个好习惯,有个小问题就是 history 记录了的大量信息在系统启动后就被 load 到内存里,并且一直保存在内存里,这样浪费了不少内存,据统计100000条历史记录大概占用 10MB 左右的内存。对于优化过的 64MB/128MB 小内存 VPS 来说 10MB 的可用内存可以干很多事情,比如启用一个 MySQL 服务,开多个 Nginx/PHP-CGI,开个 syslogd, openvpn 等,把 10MB 留给 history 实在太浪费。那么如何保存尽量多的历史记录而又不浪费内存呢?一个办法就是把历史记录定期保存到硬盘上,bash 的当前历史记录保存在 .bash_history 里,只要定期清理这个文件的记录就可以了:

#!/bin/bash
# archive linux command history files
# written by vpsee.com

umask 077
maxlines=2000

lines=$(wc -l < ~/.bash_history)

if (($lines > $maxlines)); then
    cut=$(($lines - $maxlines))
    head -$cut ~/.bash_history >> ~/.bash_history.sav
    sed -e "1,${cut}d"  ~/.bash_history > ~/.bash_history.tmp
    mv ~/.bash_history.tmp ~/.bash_history
fi

上面脚本所做的事情很简单,检查 .bash_history 文件,如果行数超过2000行就剪裁2000行记录并添加到 .bash_history.sav 这个文件里,这样我们就可以保存所有的历史记录,而且当前的历史记录不超过2000行,只占用少量资源。