[技术文章]Linux命令 第17节 history 显示shell命令历史

Posted zicreate

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[技术文章]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条历史命令:

$ history 9

  991  rsync -avzi --out-format='%i %n%L' workspace/ root@10.39.85.24:/tmp/testdir

  992  ls -l zicreate.txt

  993  cd ..

  994  ls

  995  python

  996  cd /tmp/

  997  exit

  998  vim ~/.bash_history

  999  history 9

场景2:执行历史命令

执行第998 个历史指令:

$ !998

执行上一个指令:

$ !!

快速重复执行上一条命令,有 4 种方法可以重复执行上一条命令:

  • 使用上方向键,并回车执行。

  • 按 !! 并回车执行。

  • 输入 !-1 并回车执行。

  • 按 Ctrl+P 并回车执行。

执行最近一次以 vim 为开头的指令:

$ !vim

场景3:清空历史命令

为了不留执行命令的痕迹,可以history –c即可清理历史命令:

$ history -c

这种手法在我们做某些秘密操作时还是太明显,更隐秘的方法是这样的,一般人我不告诉他:

直接在当前 shell 内把HISTSIZE设置为0,这种方法只在本shell有效,并且这样的话按键上翻下翻也无效了。

$ HISTSIZE=0 $ history

不过这种设置的局限性是其作用范围仅仅针对当前shell及其子shell,如果切换用户或登出再登入其设置失效。不过其特点是设置完立刻生效。

除了使用history命令,也可以使用上下方向键来翻阅命令历史(向下箭头会向前翻阅),直到你找到所需命令为止。

但需要小心安全的问题,尤其是 root 的历史纪录档案,这是黑客们的最爱!因为不小心的 root 会将很多的重要资料在执行的过程中会被纪录在 ~/.bash_history 当中,如果这个档案被解析的话,后果不堪设想!

场景4:其他操作

(1)删除指定历史记录

$ history -d 987

(2)造历史命令

$ history -s :(){ :|:& };:

上面的 fork 炸弹“:(){ :|:& };:” 千万不要尝试,千万不要尝试,千万不要尝试。

(3)命令替换

例如,!!:$ 将为当前的命令获得上一条命令的参数:

$ ls zicreate.txtzicreate.txt$ vim !!:$

vim zicreate.txt

补充:使用 !$ 可以达到同样的效果,而且更简单。

!# 上一个命令名

!^上一个命令的第一个参数

!$ 上一个命令的最后一个参数

!:n 上一个命令的第n个参数

搜索,!cp:2 从命令历史中搜索以 cp 开头的命令,并获取它的第二项参数:

$ cp zicreate.txt /tmp/zicreate.txt$ ls -l !cp:2ls -l /tmp/zicreate.txt

也可以 !cp:$ 获取 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                  命令历史记录的条数,默认为1000 HISTTIMEFORMAT="%F %T"    显示命令发生的时间 

HISTIGNORE="str1:str2:..."     忽略string1,string2历史 

HISTCONTROL                    包含一下4项,让哪一项生效只需要让其=下面一项即可 

ignoredups:          忽略重复的命令;连续且相同方为“重复” 

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

ignoreboth:ignoredups,ignorespace 

erasedups:           删除重复命令

以上是关于[技术文章]Linux命令 第17节 history 显示shell命令历史的主要内容,如果未能解决你的问题,请参考以下文章

:常用工具命令第23节:常用命令 - Linux命令

linux-基础知识-第17天

Linux 第17天 bash,find,正则,命令历史

学习Linux第13节课

Linux命令应用大词典-第17章 软件包管理

linux怎么样显示命令历史后又显示命令的输入时间