铭记历史,圆梦中华。在Linux操作系统中,对于管理员操作的命令进行查询也是非常重要,而且熟练掌握调用命令历史能提高管理员管理系统的效率。
history的命令缓存数目是由一个在/etc/profile文件名为HISTSIZE的变量决定,可以通过env命令查看当前设定的数目,也可以通过修改HISTSIZE的数值来决定缓存多少条命令。建议修改添加至自己家目录下面的.bash_profile,不要修改全局的变量。以下所有变量我均是添加在自己的家目录下面的.bash_profile,若有需要请自行在/etc/profile修改
常用选项
n 列出当前的n条命令
-a 清除缓存中的所有命令
-c 清除当前shell中缓存的命令
-r :将 histfiles 的内容读到目前这个 shell 的 history 记忆中
-w :将目前的 history 记忆内容写入 histfiles。Linux系统当你在shell(控制台)中输入并执行命令时,shell会自动把你的命令记录到历史列表中,一般保存在用户目录下的.bash_history文件中。默认保存1000条,你也可以更改这个值。如果你键入 history, history会向你显示你所使用的前1000个历史命令,并且给它们编了号,你会看到一个用数字编号的列表快速从屏幕上卷过。你可能不需要查看1000个命令中的所有项目, 当然你也可以加入数字来列出最近的 n 笔命令列表。linux中history命令不仅仅让我们可以查询历史命令而已. 我们还可以利用相关的功能来帮我们执行命令。运行特定的历史命令history会列出bash保存的所有历史命令,并且给它们编了号,我们可以使用“叹号接编号”的方式运行特定的历史命令.
常用用法:
!NUMBER 执行第NUMBER条命令
!! 和crtl+p 都是执行上一条命令
! COMMAND e.g !c 执行最近的以c开头的命令,切记是从后往前最近的一条以C开头的命令。
常用案例
1、查看history命令使用的时间
由于history列出的命令很多,我们可以通过管道命令将history命令送给less命令方便查看,e.g history |less ;
同时我们可以设置history的环境变量HISTTIMEFORMAT让其显示每条命令执行时间,方便查看和了解当前系统何时执行过什么命令.
export HISTTIMEFORMAT='%F %T '
若要是想永久让history命令显示时间,将上面这条命令追加至当前用户的家目录下面.bash_profile里面。
2、用Ctrl + R搜索历史命令
我非常确信这应该是你最常使用的history特性,当你执行了一串相当长的命令之后,你只要用关键字搜索一下历史命令然后重新执行这条命令而不需要将整条命令再输一遍。方法是:按下Ctrl +R然后输入关键字。 在以下示例中,我搜索“sys”,则显示以前的命令中含有”sys”的命令“cat/etc/system-release”。
[注:在命令行提示符下按下Ctrl+R,终端将显示如下提示―reverse-i-search‖]
(reverse-i-search)`sys`: cat/etc/system-release
[注:当看到你要的命令后按回车键,就可以重新执行这条命令了]
cat /etc/system-release
而有的时候你需要在执行一条历史命令之前编辑它.比如,你可以像下面那样搜索“sys”,终端显示历史命令“cat /etc/system-release”,选择它把"system"改为“centos”然后执行它
[注: 在命令提示符下按 Ctrl+R , 将会显示提示符‖reverse-i-search‖]
(reverse-i-search)`sys`:cat /etc/system-release
[注: 看到你想要的命令后按下左键或者右键,就可以在执行这条命令之前编辑它了]
cat /etc/centos-release
3、使用HISTFILE改变历史文件名
默认情况下,命令历史被储存在.bash_history文件中,把下面的一行添加到.bash_profile文件中,重新登录shell,则.commandline_warrior文件将取代.bash_history文件用来储存历史命令。你可以使用这个命令来追踪不同终端中执行的命令,届时只需要将不同终端中所执行的命令保存在不同的历史文件中即可。这样就能知道系统出问题到底是谁在操作导致的。
vim ~/.bash_profile
HISTFILE=/root/.commandline_warrior
4、使用HISTCONTROL来消除命令历史中的连续重复条目;
cat /etc/profile
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
这个HISTCONTROL变量就是控制是否显示连续的重复条目,连续敲三次ls, 这三次ls就叫做连续重复命令;假若敲一次ls,一次cd,再一次ls,这不叫做连续重复命令;
ignoreups就是ignoredups去除连续重复的命令,只能剔除连续的重复条目;要清除整个命令历史中的重复条目,可以将 HISTCONTROL 设置成 erasedups;
ignorespce 是以空格开头的命令在history中不显示,e.g [spcace] ls ,再去history就不能发现ls这个命令,但是我们能看到这个命令是执行了的。
ignoreboth 就是同时带着上面两种选项的结果。
5、将上一个命令的参数传递给当前命令。
!!:$将上一个命令的参数传递给当前命令
e.g cat /etc/profile
vim !!:$ 这个打开还是/etc/profile 这个文件
!^ 将上一个命令中的第一个参数传递给当前命令
cp /etc/profile /tmp
vim !^ 打开的文件就是 /etc/profile
6、替换特定命令的特定参数
在下例中,!cp:2 在命令历史中查找以cp开头的命令,并将其第二个参数做为当前命令(ls -l)的参数。
cp /etc/profile /tmp
ls -l !cp:2
ls -l /tmp
在下面的例子中“!cp:$”寻找先前以cp为开头的命令,并把该条指令的最后一个参数(在这个例子中依旧是第二个参数)替换到“ls –l”中。
ls -l !cp:$
ls -l /tmp
同理,ls -l !cp:^ 就是需要以cp开头命令,并把该条命令的第一个参数替换到“ls -l”中
ls -l !cp:^
ls -l /etc/profile
7、用HISTIGNORE让history在存储时忽略某些指令
有时你不想在记录里看到诸如“pwd”,“ls”之类的基本指令,可以用HISTIGNORE忽略这些指令。
注意在HISTIGNORE中添加“ls”,只忽略“ls”不忽略“ls –l”。一定要准确的写出要忽略的的指令。
#export HISTIGNORE=“pwd:ls:”
同理这条命令可以追加进家目录下的.bash_profile。
原创文章,作者:fighter,如若转载,请注明出处:http://www.178linux.com/25614