1.命令功能
history 命令用于显示shell命令历史,历史命令保存在内存中的,当退出或者登录shell时,会自动保存或读取文件"~/.bash_history"。在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量HISTSIZE进行控制。
当同一账号,同时登录多个bash时,只有最后一个退出的会写入bash_history,其他的都被覆盖了。
2.命令格式
history (参数)
[!number] [!command] [!!]
3.命令参数
-c:清空命令历史-d n:删除历史中指定的命令,n表示命令号number:显示最近的number条历史,如 history 10-a:追加本次会话新执行的命令历史列表至历史文件,因为多终端所以如果想看当前都发生了什么操作就可以执行-a进行查看-n:读历史文件(本地数据)中未读过的行到历史列表(内存数据)-r:读历史文件(本地数据)附加到历史列表(内存数据)-w:保存历史列表(内存数据)到指定的历史文件(本地数据)-s:展开历史参数成一行,附加在历史列表后。用于伪造命令历史
number:第几个指令,如 `$ !2` ,执行 history 中,命令序号为2的命令。command:指令的开头几个字母! :上一个指令4.使用场景
场景1:显示历史命令
使用history命令显示最近使用的9条历史命令:
场景2:执行历史命令
执行第998 个历史指令:
$ !998
执行上一个指令:
$ !!
快速重复执行上一条命令,有 4 种方法可以重复执行上一条命令:
使用上方向键,并回车执行。
按 !! 并回车执行。
输入 !-1 并回车执行。
按 Ctrl+P 并回车执行。
执行最近一次以 vim 为开头的指令:
$ !vim
场景3:清空历史命令
为了不留执行命令的痕迹,可以即可清理历史命令:
$ history -c
这种手法在我们做某些秘密操作时还是太明显,更隐秘的方法是这样的,一般人我不告诉他:
直接在当前 shell 内把HISTSIZE设置为0,这种方法只在本shell有效,并且这样的话按键上翻下翻也无效了。
$HISTSIZE=$history
不过这种设置的局限性是其作用范围仅仅针对当前shell及其子shell,如果切换用户或登出再登入其设置失效。不过其特点是设置完立刻生效。
除了使用history命令,也可以使用上下方向键来翻阅命令历史(向下箭头会向前翻阅),直到你找到所需命令为止。
但需要小心安全的问题,尤其是 root 的历史纪录档案,这是黑客们的最爱!因为不小心的 root 会将很多的重要资料在执行的过程中会被纪录在 ~/.bash_history 当中,如果这个档案被解析的话,后果不堪设想!
场景4:其他操作
(1)删除指定历史记录
$ history -d 987
(2)造历史命令
$ history -s :(){ ::& };:
上面的 fork 炸弹“:(){ ::& };:” 千万不要尝试,千万不要尝试,千万不要尝试。
(3)命令替换
例如,!!:$ 将为当前的命令获得上一条命令的参数:
补充:使用 可以达到同样的效果,而且更简单。
上一个命令名
上一个命令的第一个参数
上一个命令的最后一个参数
上一个命令的第n个参数
搜索, 从命令历史中搜索以 cp 开头的命令,并获取它的第二项参数:
$ cp zicreate.txt/tmp/zicreate.txt$ ls -l !cp:2ls -l /tmp/zicreate.txt
也可以 获取 cp 命令的最后一项参数:
$ls-l!cp:$ls-l/tmp/zicreate.txt
场景5:用 Ctrl + R 搜索历史命令
有时候一连串的操作,我们已经输入了太多的命令,而一条很长的历史命令通过上翻找到这条历史记录太慢的话,可以使用这个快捷操作。方法是:按下 Ctrl +R 或者 Ctrl + Shift + r 然后输入关键字。
例如我搜索 git ,显示如下:
[注:在命令行提示符下按下Ctrl+R,终端将显示如下提示(reverse-i-search),此时可以输入要搜索的关键字]
(reverse-i-search)`git': git push
如果还想继续向上查询,继续按 Ctrl+r 。当看到你要的命令后按回车键,就可以重新执行这条命令了,如果你需要在执行一条历史命令之前编辑它。看到你想要的命令后按下左键或者右键,就可以在执行这条命令之前编辑它了。
扩展
调用历史参数详解
#cmd !^ : 利用上一个命令的第一个参数做cmd的参数 #cmd !$ : 利用上一个命令的最后一个参数做cmd的参数 #cmd !* : 利用上一个命令的全部参数做cmd的参数 #cmd !:n : 利用上一个命令的第n个参数做cmd的参数#!n :调用第n条命令#!-n:调用倒数第n条命令#!!:执行上一条命令#!$:引用前一个命令的最后一个参数同组合键Esc,.#!n:^ 调用第n条命令的第一个参数#!n:$ 调用第n条命令的最后一个参数#!m:n 调用第m条命令的第n个参数#!n:* 调用第n条命令的所有参数#!string:执行命令历史中最近一个以指定string开头的命令#!string:^ 从命令历史中搜索以string 开头的命令,并获取它的第一个参数#!string:$ 从命令历史中搜索以string 开头的命令,并获取它的最后一个参数#!string:n 从命令历史中搜索以string 开头的命令,并获取它的第n个参数#!string:* 从命令历史中搜索以string 开头的命令,并获取它的所有参数
与history相关的环境变量
HISTFILE 指定存放历史文件位置,默认位置在~/.bash_profile(针对用户)、 /etc/profile(针对全局,如果 ~/.bash_profile内没有相关环境变量内容则使用全局变量设置) HISTFILESIZE 命令历史文件记录历史的条数 HISTSIZE 命令历史记录的条数,默认为1000HISTTIMEFORMAT="%F %T"显示命令发生的时间 HISTIGNORE="str1:str2:..."忽略string1,string2历史 HISTCONTROL 包含一下4项,让哪一项生效只需要让其=下面一项即可ignoredups:忽略重复的命令;连续且相同方为“重复”ignorespace:忽略所有以空白开头的命令ignoreboth:ignoredups,ignorespaceerasedups:删除重复命令
领取专属 10元无门槛券
私享最新 技术干货