Linux常用命令-history

命令

history

描述

Display or manipulate the history list
显示或更改历史命令记录

用法

1
2
3
history [-c] [-d offset] [n]
history -anrw [filename]
history -ps arg [arg...]

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Options:
n 显示最近的n条命令
-c 清除当前终端的所有历史命令
-d offset 清除指定序号的历史命令,注后续命令会自动补充序号
-a 追加当前终端的历史命令记录到`~/.bash_history`文件中
-r 读取历史记录文件内容并追加到当前终端
-p 执行命令但不保存到历史记录
-s 不执行命令仅保存到历史记录
-w 将当前终端的历史记录写入历史文件中,覆盖之前的内容[不推荐使用!]
-w filename 将当前终端的历史记录写入到指定文件中

系统环境变量说明
HISTFILE 历史记录文件的保存位置,默认~/.bash_history
HISTFILESIZE 历史记录文件的最大保存条目,默认500
HISTSIZE 历史记录显示的条目,默认500
HISTTIMEFORMAT 历史记录显示的格式
HISTIGNORE 忽略匹配的命令记录,支持泛匹配*,分割符号为冒号:
HISTCONTROL 控制命令历史的生成,可选参数如下
igoredups 忽略连续重复的命令
ignorespace 忽略以空格开头的命令
ignoreboth 同时忽略以上两种
erasedups 忽略所有历史命令中的重复命令

bash支持的命令历史快捷键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
执行上一个命令:向上方向键;按!!;输入!-1;多次按Ctrl+p重复显示之前的命令(同向上方向键)
执行下一个命令:向下方向键;或多次按Ctrl+n
执行历史中的某条命令:!n !22
执行倒数第n个命令:!-n !-4
执行最近的以字符串开头的命令:!keyword !service
执行最近的包含关键字的命令:!?keyword !?share
执行上一条命令的第n列命令或参数,常用于写脚本:!:n(!:0执行第0列命令,!:1执行第1列命令或参数)
搜索历史命令:Ctrl+r,退出Ctrl+g,输入对应的关键字即可自动匹配,然后按回车即可再次执行匹配到的命令,或者按`esc`重新编辑匹配到的命令
重新调用前一个命令中的最后一个参数:!$ ; Esc,.(按Esc松开再按.键)多次执行来调用前n个命令的最后一个参数;

!string:p 仅打印出最近的以字符串开头的命令历史而不执行
!$:p 打印输出!$(即上一条命令的最后一个参数)的内容
!*:p 打印输出!*(即上一条命令的所有参数)的内容
^string 删除上一条命令中的第一个string
^string1^string2 将上一条命令中的string1替换为string2
!:gs/string1/string2 将上一条命令中的所有的string1都替换为string2

调用历史参数
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 !string:^ 从命令历史中搜索以string开头的命令,并获取它的第一个参数
cmd !string:$ 从...最后一个参数
cmd !string:n 从...第n个参数
cmd !string:* 从...所有参数

注意

1.不执行当前终端上已经输入的命令,可以在行首加#.命令已经输入一半,突然不想执行了,可以在命令前加‘#’(快捷键ctrl+a跳到行首,然后输入#,回车),将整个命令变成注释。这样的话可以在命令历史中找到该命令,而不会执行。
2.注意如果是在shell脚本中调用history -c清空当前shell的历史命令,是不会成功的,因为bash执行命令时默认是会产生一个子进程来执行该命令,在子进程中执行history -c不是清除你当前shell的历史命令了。可以使用source来执行脚本(source ./脚本),source 指在当前bash环境下执行命令

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# 默认显示所有历史记录
$ history
1 2020-12-16 22:44:17 cd
2 2020-12-16 22:44:21 cd /tmp
3 2020-12-16 22:44:23 cd /data
4 2020-12-16 22:44:24 ls -al
5 2020-12-16 22:44:30 history
# 显示最近10条历史记录
$ history 10
# 删除第一条历史记录
$ history -d 1
$ history
1 2020-12-16 22:44:21 cd /tmp
2 2020-12-16 22:44:23 cd /data
3 2020-12-16 22:44:24 ls -al
4 2020-12-16 22:44:30 history
5 2020-12-16 22:44:38 history -d 1
6 2020-12-16 22:44:42 history
# 删除所有历史记录
$ history -c

# 执行命令但不保存在历史列表中
$ history -p `pwd && ls`
# 不执行命令仅保存命令到历史列表中
$ history -s "rm /data/aaa"

# 执行以ls开头的命令
$ !ls
ls /home/
abc/ usera/
# 仅打印出以l开头的命令而不执行
$ !l:p
ls /etc/init.d
# 参数替换
$ id -u usera
1000
$ ^usera^root
id -u root
0
$ ls -l /home/usera
# 显示第0列的命令
$ !:0
ls
# 显示第2列的参数
$ !:2
/home/usera

# 彻底清空命令历史
$ rm -rf .bash_history
$ history -c
$ exit

# 历史记录文件的时间格式为Unix时间戳
$ more .bash_history
#1608129891
history
#1608129911
history -r
#1608129913
history

# 关闭当前会话的命令历史记录,注意这条set命令会保存到命令历史
$ set +o history
# 开启命令历史记录
$ set -o history

# 忽略指定命令,如下执行ls*或pwd*命令将不会记录到命令历史,注意分隔符为冒号:
$ export HISTIGNORE="ls*:pwd*"

# 查看历史记录变量
$ set | grep HIST
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HISTTIMEFORMAT='%F %T '

# 更改变量
$ grep ^HIS /etc/profile
HISTSIZE=10000
HISTFILESIZE=10000
HISTCONTROL=ignoreboth
HISTTIMEFORMAT="%F %T $(whoami)"
HISTIGNORE="pwgen*:genpasswd*"