在Linux中,history命令是用于显示历史执行命令以及读取命令历史文件中的历史执行的命令到内存中,或者从内存中把执行命令的历史写入到保存历史执行命令的文件中的内部命令。
语法:history (选项) (参数)
选项:-c: 清空命令历史
-d n: 删除历史中指定的第n个命令
n: 显示最近的n条历史
-a: 追加本次会话新执行的命令历史列表至历史文件
-n: 读历史文件中未读过的行到历史列表
-r: 读历史文件附加到历史列表
-w: 保存历史列表到指定的历史文件
-p: 展开历史参数成多行,但不存在历史列表中
-s: 展开历史参数成一行,附加在历史列表后
储存命令历史的文件在
~/bash_history
当我们登陆shell的时候,系统会将保存在文件中的命令历史读取到内存中,所以我们直接键入 history
便可以查询命令历史。
[root@centos7 ~]# history 查看内存中命令历史记录
1 history
2 reboot
3 init 3
4 history
5 ls
6 cd
7 history
[root@centos7 ~]#
直接键入history
查询当前内存中已存在的历史,那么这个时候.bash_history
文件中的历史也是这样的吗?
[root@centos7 ~]# cat .bash_history 查看文件中命令历史记录
history
reboot
[root@centos7 ~]#
很明显,在.bash_history
中储存的命令历史截止到了reboot
重启命令。
当计算机正常执行命令关闭、重启或者用户正常退出的时候系统便会将内存中的命令历史写入到.bash_history
中去,当用户重新登陆后又会将之前储存在.bash_history
文件中的命令历史读取到内存中。
[root@centos7 ~]# exit
logout
[root@centos7 ~]# cat .bash_history
history
reboot
init 3
history
ls
cd
history
cat .bash_history
exit
重新登陆后便可以发现.bash_history
文件中的命令历史已经更新了,截止到exit
history -c
命令用于清空命令历史记录。注意:这里只是清理内存中的历史记录在.bash_history
中的命令记录不会被该命令清除,我将在下面做实例演示。
[root@centos7 ~]# history
1 reboot
2 init 3
3 history
4 ls
5 cd
6 history
7 cat .bash_history
8 exit
9 cat .bash_history
10 history
11 history -d 1
12 history
[root@centos7 ~]#
键入history
后当前内存中的命令历史如上所示。
[root@centos7 ~]# history -c 清除内存中的命令历史记录
[root@centos7 ~]# history 查看内存中的命令历史记录
1 history
[root@centos7 ~]#
当键入history -c
命令后再次键入history
便可发现内存中的命令历史已经清空,当前命令历史只剩下history -c
后的一条命令,那么现在.bash_history
中的命令历史还在吗?
[root@centos7 ~]# cat .bash_history 查看文件中的命令历史记录
history
reboot
init 3
history
ls
cd
history
cat .bash_history
exit
[root@centos7 ~]#
由此可见history -c
只是清除内存中的命令历史,.bash_history
中的命令历史不会被清除。
history -d n
用于删除使用history
查询的内存中的命令历史中指定的第n个命令,也就是说删除的是内存中的命令历史,与.bash_history
文件无关。
[root@centos7 ~]# history
1 history
2 cat .bash_history
3 history
[root@centos7 ~]# history -d 1 删除第1条记录
[root@centos7 ~]# history
1 cat .bash_history
2 history
3 history -d 1
4 history
[root@centos7 ~]#
由上面的实例可以看到,我第一次查询命令历史第1条命令是history
,当执行history -d 1
后第1条命令历史变成了cat .bash_history
,在第1次查询命令历史的时候该命令是第2条。当history -d n
执行成功后被删除的那条历史命令就会被后面的历史所替代,后面的命令历史都向前靠拢。
history n
用于显示最近n条命令。
实例:
[root@centos7 ~]# history
1 cat .bash_history
2 history
3 history -d 1
4 history
[root@centos7 ~]# history 2 显示最近两条记录
4 history
5 history 2
[root@centos7 ~]#
history -a
用于将内存中的命令历史记录追加到.bash_history
中而不是覆盖。
第一步先看看历史文件中有哪些命令历史
[root@centos7 ~]# cat .bash_history
history
reboot
init 3
history
ls
cd
history
cat .bash_history
exit
然后执行命令后再次查看
[root@centos7 ~]# history -a
[root@centos7 ~]# cat .bash_history
history
中间省略
exit
cat .bash_history
history
history -d 1
history
history 2
cat .bash_history
history -a
[root@centos7 ~]#
命令生效。注意:这里是追加在后面而不是覆盖整个文件内容。
history -n
用于将.bash_history
中不存在于内存中的命令历史读取到内存中去。这里注意是只读取内存中命令历史没有的命令历史,如果内存中已经存在的相同命令历史就不会再次读取。
实例:
因为现在内存中命令历史比.bash_history
中的多,所以我先执行history -c
命令删除内存中的命令然后再执行history -n
查看效果。
[root@centos7 ~]# history -c
[root@centos7 ~]# history
1 history
[root@centos7 ~]#
以上为清除内存中命令历史的操作
[root@centos7 ~]# history -n 读取文件中未读取过的记录
[root@centos7 ~]# history
1 history
2 history -n
3 init 3
4 history
5 ls
中间省略
18 cat .bash_history
19 history -a
20 history
[root@centos7 ~]#
由上可见history -n
命令是直接把.bash_history
中的命令历史读取到内存中已存在的命令历史后面,而不是前面。
history -r
读历史文件附加到历史列表,也就是把.bash_history
中的命令历史记录直接加到内存中命令历史记录后面,与history -n不同的是history -n只读取没有读过的内容。
那么为了实验我还是要先执行history -c
清理一下内存中的历史记录然后再执行history -r
,清理操作我就不再做演示。
[root@centos7 ~]# cat .bash_history
history
reboot
init 3
中间省略
cat .bash_history
histroy -a
history -a
先查看.bash_history
文件确认记录内容
[root@centos7 ~]# history -r 读取历史文件到内存中命令历史记录
[root@centos7 ~]# history
1 history
2 history -r
3 history
4 reboot
5 init 3
中间省略
17 cat .bash_history
18 histroy -a
19 history -a
20 history
[root@centos7 ~]#
如上所示.bash_history
中的记录已读取
history -w
用于用内存中的命令历史记录覆盖.bash_history
中的记录,直接覆盖毫不留情。
[root@centos7 ~]# history -c 清空内存中的记录
[root@centos7 ~]# history
1 history
[root@centos7 ~]# history -w 将内存中的记录覆盖到文件中
[root@centos7 ~]# cat .bash_history
history
history -w
[root@centos7 ~]#
如上所示,内存中的记录覆盖到了文件中。
history -p 可以展开历史参数成多行,但不存在历史列表中
[root@centos7 ~]# history -c
[root@centos7 ~]# history -p aa bb
aa
bb
[root@centos7 ~]# history
1 history
[root@centos7 ~]#
history -s这个命令相当于直接在内存记录中添加一条内容。
实例:
[root@centos7 ~]# history -c
[root@centos7 ~]# history -s rm -rf /* Linux上最好玩的命令
[root@centos7 ~]# history
1 rm -rf /1 /app /bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /path /proc /root /run /sbin /srv /sys /tmp /usr /var
2 history
[root@centos7 ~]#
如上所示,虽然内存历史记录里面有这么一条,但是并没有执行过。
cmd代表任意命令
cmd !^ : 利用上一个命令的第一个参数做cmd的参数
cmd !$ : 利用上一个命令的最后一个参数做cmd的参数
cmd !* : 利用上一个命令的全部参数做cmd的参数
cmd !:n : 利用上一个命令的第n个参数做cmd的参数
cmd !n:^ 调用第n条命令的第一个参数
cmd !n:$ 调用第n条命令的最后一个参数
cmd !n:m 调用第n条命令的第m个参数
cmd !n:* 调用第n条命令的所有参数
cmd !st:^ 从命令历史中搜索以 st 开头的命令 ,并获取它的第一个参数
cmd !st:$ 从命令历史中搜索以 st 开头的命令 ,并获取它的最后一个参数
cmd !st:n 从命令历史中搜索以 st 开头的命令 ,并获取它的第n个参数
cmd !st:* 从命令历史中搜索以 st 开头的命令 ,并获取它的所有参数
所有实例均省略不必要内容
利用上一个命令的第一个参数做cmd的参数
实例:
[root@centos7 ~]# ll /
[root@centos7 ~]# cd !^
cd /
[root@centos7 /]#
利用上一个命令的最后一个参数做cmd的参数
实例:
[root@centos7 ~]# ls /bin /dev
[root@centos7 ~]# cd !$
cd /dev
[root@centos7 dev]#
利用上一个命令的全部参数做cmd的参数
实例:
[root@centos7 ~]# ls /bin /dev
[root@centos7 dev]# ll !*
ll /bin /dev
[root@centos7 dev]#
利用上一个命令的第n个参数做cmd的参数
实例:
[root@centos7 dev]# history
1 cd
2 cd /boot
3 cd ~
4 ll ~
[root@centos7 dev]# ls !2
ls cd /boot
[root@centos7 dev]#
调用第n条命令的第一个参数
[root@centos7 ~]# history
13 ls /bin /dev
14 cd /dev
15 ls /bin /dev
[root@centos7 ~]# cd !13:^
cd /bin
[root@centos7 bin]#
调用第n条命令的最后一个参数
[root@centos7 ~]# history
13 ls /bin /dev
14 cd /dev
15 ls /bin /dev
[root@centos7 ~]# cd !13:$
cd /dev
[root@centos7 dev]#
调用第n条命令的第m个参数
[root@centos7 ~]# history
13 ls /bin /dev
14 cd /dev
15 ls /bin /dev
[root@centos7 ~]# cd !13:2
cd /dev
[root@centos7 dev]#
调用第n条命令的所有参数
[root@centos7 ~]# history
13 ls /bin /dev
14 cd /dev
15 ls /bin /dev
[root@centos7 ~]# ll !13:*
ll /bin /dev
[root@centos7 ~]#
从命令历史中搜索以 st 开头的命令 ,并获取它的第一个参数
[root@centos7 app]# touch a b 在/app下创建 a b两个文件
[root@centos7 app]# history
26 cd /app
27 touch a b
28 history
[root@centos7 app]# ll !tou:^
ll a
[root@centos7 app]#
从命令历史中搜索以 st 开头的命令 ,并获取它的最后1个参数
[root@centos7 app]# touch a b
[root@centos7 app]# history
26 cd /app
27 touch a b
28 history
[root@centos7 app]# ll !tou:$
ll b
[root@centos7 app]#
从命令历史中搜索以 st 开头的命令 ,并获取它的第n个参数
[root@centos7 app]# touch a b
[root@centos7 app]# history
26 cd /app
27 touch a b
28 history
[root@centos7 app]# ll !tou:2
ll b
[root@centos7 app]#
从命令历史中搜索以 st 开头的命令 ,并获取它的所有参数
[root@centos7 app]# touch a b
[root@centos7 app]# history
26 cd /app
27 touch a b
28 history
[root@centos7 app]# ll !tou:*
ll a b
[root@centos7 app]#
HISTSIZE:命令历史记录的条数,默认1000 HISTFILE:指定历史文件,默认为~/.bash_history
HISTFILESIZE:命令历史文件记录历史的条数
HISTIGNORE=“str1:str2:… “ 忽略string1,string2历史 控制命令历史的记录方式:
环境变量:HISTCONTROL
ignoredups 默认,忽略重复的命令,连续且相同为“重复“ignorespace忽略所有以空白开头的命令
ignoreboth 相当于ignoredups, ignorespace的组合
export 变量名=”值“ 存放在 /etc/profile 或 ~/.bash_profile