经常使用Linux命令行时,有效使用历史记录可以极大提高效率。这篇文章将介绍history命令的常用技巧。
使用HISTTIMEFORMAT显示时间戳
通常,当您从命令行键入历史(history)时,它会显示命令序号和命令。出于审计目的,将时间戳与命令一起显示可能会更有益,如下所示。
# export HISTTIMEFORMAT='%F %T '
# history | more
1 2008-08-05 19:02:39 service network restart
2 2008-08-05 19:02:39 exit
3 2008-08-05 19:02:39 id
4 2008-08-05 19:02:39 cat /etc/redhat-release
使用Control+R搜索历史
这可能是您最经常使用的history特性。当您已经执行了一个非常长的命令时,您只需使用关键字搜索历史,而无需完全重新键入即可再次执行相同的命令。按下Control+R键并键入关键字。在下面的示例中,搜索了red,显示了历史中包含单词red的上一个命令“cat /etc/redhat-release”。
(Control+R)
(reverse-i-search)`red': cat /etc/redhat-release
[Note: 按回车键会执行命令]
# cat /etc/redhat-release
Fedora release 9 (Sulphur)
假如你想修改命令.比如,下面这个例子,搜索httpd 显示的是 service httpd stop , 按左右箭头把stop 改为start再执行
(reverse-i-search)`httpd': service httpd stop
#service httpd start
使用4种不同方法快速重复上一个命令
有时候您可能会因为各种原因而重复执行先前的命令。以下是重复上次执行的命令的4种不同方法。
使用向上箭头查看上一个命令,并按 enter 键执行它
从命令行中输入 !! 并按 enter 键
从命令行中输入 !-1 并按 enter 键
按下 Control+P 将显示上一个命令,按 enter 键执行。
执行历史中的特定命令
面的示例中,如果要重复执行第四个命令,您可以执行!4如下所示。
# history | more
1 service network restart
2 exit
3 id
4 cat /etc/redhat-release
# !4
cat /etc/redhat-release
Fedora release 9 (Sulphur)
执行以特定单词开头的先前命令
键入!后跟您希望重新执行的命令的前几个字母。在以下示例中,输入!ps并按回车执行了以ps开头的先前命令“ps aux | grep yp”。
使用HISTSIZE控制历史记录中的总行数
将以下两行添加到.bash_profile文件中,然后重新登录到bash shell中以查看更改。在此示例中,只有450个命令将存储在bash历史记录中。
# vi ~/.bash_profile
HISTSIZE=450
HISTFILESIZE=450
使用HISTFILE更改历史文件名
默认情况下,历史记录保存在~/.bash_history文件中。将以下行添加到.bash_profile文件中,并重新登录到bash shell,以将历史命令保存在.commandline_warrior文件中而不是.bash_history文件中。
# vi ~/.bash_profile
HISTFILE=/root/.commandline_warrior
使用HISTCONTROL消除历史中连续重复的条目
在下面的示例中,pwd被输入了三次,当您执行history时,您可以看到所有3次连续的发生。要消除重复项,请将HISTCONTROL设置为ignoredups。
# pwd
# pwd
# pwd
# history | tail -4
44 pwd
45 pwd
46 pwd [三个pwd命令]
47 history | tail -4
# export HISTCONTROL=ignoredups
# pwd
# pwd
# pwd
# history | tail -3
56 export HISTCONTROL=ignoredups
57 pwd [显示一个]
58 history | tail -4
使用HISTCONTROL消除整个历史记录中的重复项
上面的ignoredups仅在连续的命令重复时消除重复项。要消除整个历史记录中的重复项,请将HISTCONTROL设置为erasedups。
# export HISTCONTROL=erasedups
# pwd
# service httpd stop
# history | tail -3
38 pwd
39 service httpd stop
40 history | tail -3
# ls -ltr
# service httpd stop
# history | tail -6
35 export HISTCONTROL=erasedups
36 pwd
37 history | tail -3
38 ls -ltr
39 service httpd stop
[pwd后面的 service httpd stop 已经消除了]
40 history | tail -6
使用HISTCONTROL强制历史记录不记住特定命令
当您执行一个命令时,您可以通过将HISTCONTROL设置为ignorespace并在命令前加上空格来指示历史忽略该命令。要理解ignorespace的工作原理是好的,但作为最佳实践,请不要故意隐藏历史记录中的任何内容。
# export HISTCONTROL=ignorespace
# ls -ltr
# pwd
# service httpd stop [命令开始有个空格]
# history | tail -3
67 ls -ltr
68 pwd
69 history | tail -3
使用-c选项清除所有先前的历史记录
有时可能想清除所有以前的历史记录,但还希望保留历史记录功能。
# history -c
从历史命令中替换单词
当您搜索历史时,可能想要执行一个不同的命令,但想使用刚刚命令中的相同参数。
下面例子中vi命令后面的 !!:$ 得到了前面命令的参数
# ls anaconda-ks.cfg
anaconda-ks.cfg
# vi !!:$
vi anaconda-ks.cfg
下面例子中vi命令后面的 !^ 得到了前面命令的第一个参数
# cp anaconda-ks.cfg anaconda-ks.cfg.bak
anaconda-ks.cfg
# vi !^
vi anaconda-ks.cfg
替换特定命令的特定参数
在下面的示例中,!cp:2搜索历史中以cp开头的上一个命令,并将cp的第二个参数替换为ls -l命令。
# cp ~/longname.txt /really/long-filename.txt
# ls -l !cp:2
ls -l /really/long-filename.txt
在下面的示例中,!cp:2搜索历史中以cp开头的上一个命令,并将cp的最后一个参数替换为ls -l命令。
# ls -l !cp:$
ls -l /really/long-filename.txt
使用HISTSIZE禁用历史记录的使用
如果要完全禁用历史记录,不希望bash shell记住键入的命令,则将HISTSIZE设置为0。
# export HISTSIZE=0
# history
# [所有的历史记录都消除了]
使用HISTIGNORE忽略特定命令的历史记录
有时可能不希望使用基本命令(如pwd和ls)在历史记录中堆积。使用HISTIGNORE指定要从历史记录中忽略的所有命令。请注意,将ls添加到HISTIGNORE中将只忽略ls而不是ls -l。因此必须提供要从历史记录中忽略的确切命令。
# export HISTIGNORE="pwd:ls:ls -ltr:"
# pwd
# ls
# ls -ltr
# service httpd stop
# history | tail -3
79 export HISTIGNORE="pwd:ls:ls -ltr:"
80 service httpd stop
81 history
[ls and ls -ltr已经看不见了]