Linux命令 第17节 history 显示shell命令历史

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:删除重复命令

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180117G07MRH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券