命令 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 $ 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 /home/abc/ usera/ $ !l:p ls /etc/init.d$ id -u usera 1000 $ ^usera^root id -u root0 $ ls -l /home/usera $ !:0 ls $ !:2 /home/usera $ rm -rf .bash_history $ history -c $ exit $ more .bash_history history history -rhistory $ set +o history $ set -o history $ 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*"