使用Bash shell,会执行过的命令记录到history对应的缓冲区中。当用户注销时,会将history缓存区中的命令历史追加保存到~/.bash_history文件中。当下次登录shell时,系统会读取命令历史文件中记录的命令到命令缓存区。利用命令历史,不仅可以了解之前所做的操作,也可以方便重复执行。

1. history命令

Bash Shell中指供一个内部命令history,可以显示和管理曾经执行过的命令列表。

  • 语法 :

    • history [n]

    • history -c

    • history -d offset

    • history -anrw [filename]

    • history -p arg [arg ...]

    • history -s arg [arg ...]

  • OPTIONS

    • -c : 清空命令历史

    • -d offset : 删除历史中指定的第offset个命令

    • n : 显示最近的n条历史

    • -a : 追加本次会话新执行的命令历史列表至历史文件

    • -r : 读历史文件附加到历史列表

    • -w : 保存历史列表到指定的历史文件

    • -n : 读历史文件中未读过的行到历史列表

    • -p : 展开历史参数成多行,但不存在历史列表中

    • -s : 展开历史参数成一行,附加在历史列表后

2. history命令相关的shell变量

控制历史列表的变量如下:

  • HISTSIZE : 命令历史记录的条数

  • HISTFILE : 指定历史文件,默认为~/.bash_history

  • HISTFILESIZE : 命令历史文件记录历史的条数

  • HISTTIMEFORMAT="%F %T " : 显示时间

  • HISTIGNORE="str1:str2*:… " : 忽略str1命令,str2开头的历史

  • HISTCONTROL : 控制命令历史的记录方式,可设置的值如下:

    • ignoredups : 默认,忽略重复的命令,连续且相同为“重复”

    • ignorespace : 忽略所有以空白开头的命令

    • ignoreboth : 相当于ignoredups, ignorespace的组合

    • erasedups : 删除重复命令

提示: 如果要持久保存上述变量,需要将上面指令存放在/etc/profile或者~/.bash_profile

[root@node01 ~]# HISTTIMEFORMAT="%F %T "
[root@node01 ~]# echo $HISTTIMEFORMAT
%F %T
[root@node01 ~]# history 
    1  2020-08-04 02:42:14 init 0
    2  2020-08-04 02:42:14 ip a
    3  2020-08-04 02:42:14 lsblk
    4  2020-08-04 02:42:14 df -h
    5  2020-08-04 02:42:14 df -hT
    6  2020-08-04 02:42:14 init 0
    7  2020-08-04 02:42:14 ping baidu.com

3. 命令历史的快捷方式使用

利用历史的快捷键可以提高输入命令的速度,提高工作效率,也可以避免错误。常见的命令历史快捷键如下

  • 重复前一个命令。有4种方法

    • 重复前一个命令使用上方向键,并回车执行

    • !!并回车执行

    • 输入!-1并回车执行

    • Ctrl+p并回车执行

  • 调用命令快捷键

    • !:0 : 执行前一条不包含参数的命令

    • !n : 执行history命令输出对应序号n的命令

    • !-n : 执行history历史中倒数第n个命令

    • !string : 重复前一个以string开头的命令

    • !?string : 重复前一个包含string的命令

    • !string:p : 仅打印命令历史,而不执行

    • !$:p : 打印输出 !$ (上一条命令的最后一个参数)的内容

    • !*:p : 打印输出!*(上一条命令的所有参数)的内容

    • ^string : 删除上一条命令中的第一个string

    • ^string1^string2 : 将上一条命令中的第一个string1替换为string2

    • !:gs/string1/string2 : 将上一条命令中所有的string1都替换为string2

    • 使用up(向上)和down(向下)键来上下浏览从前输入的命令

    • ctrl-r来在命令历史中搜索命令,会出现以下内容。输入记忆中的历史命令来搜索命令历史

      (reverse-i-search)`' :
    • Ctrl+g : 从历史搜索模式退出

  • 调用前一个命令中最后一个参数

    • !$

    • Esc, .(点击Esc键后松开,然后点击.键)

    • Alt+ .(按住Alt键的同时点击.键)

  • 调用历史参数(command表示命令主体,连接后面参数)

    • command !^ : 利用上一个命令的第一个参数做cmd的参数

    • command !$ : 利用上一个命令的最后一个参数做cmd的参数

    • command !* : 利用上一个命令的全部参数做cmd的参数

    • command !:n : 利用上一个命令的第n个参数做cmd的参数

    • command!n:^ : 调用第n条命令的第一个参数

    • command !n:$ : 调用第n条命令的最后一个参数

    • command!n:m : 调用第n条命令的第m个参数

    • command !n:* : 调用第n条命令的所有参数

    • command !string:^ : 从命令历史中搜索以string开头的命令,并获取它的第一个参数

    • command !string:$ : 从命令历史中搜索以string开头的命令,并获取它的最后一个参数

    • command !string:n : 从命令历史中搜索以string开头的命令,并获取它的第n个参数

    • command !string:* : 从命令历史中搜索以string开头的命令,并获取它的所有参数

    : command表示命令主体 . 后面快捷键表示调用的参数


熊熊