设为首页 收藏本站
查看: 1089|回复: 0

[经验分享] Linux中的history命令

[复制链接]

尚未签到

发表于 2018-5-20 06:53:20 | 显示全部楼层 |阅读模式
  通过history命令可以查看我们在系统中输入过的命令

  

  history命令的一些常用参数
  -c  清空内存中命令历史
  -d #  删除指定的历史命令,比如 history -d 100 ,就是删除第100个命令历史
  # : 显示最近的#条历史,例如:history 20 ,表示显示最近的20条命令历史
  -a: 追加本次会话新执行的命令历史列表至历史文件
  -n: 将历史文件中未读过的行加载到内存中的历史列表,方便多个终端同步内存中的命令历史。
  -r: 读取历史文件中的所有历史命令到内存中的历史列表,即使内存中的列表中已经存在这条历史。
  -w: 保存内存中历史列表到指定的历史文件,history -w ./test 把历史写入到当前目录的test文件中
  -p: 官方解释没看懂,我觉得此命令相当于echo的作用,但是使用history -p string输出的信息不被记录到历史中,
    就是“不被记录的echo,隐形echo,你可以尝试使用history -p $变量名,这样会不会觉得很像echo?
    但是如果你使用history -p string1 string2,会发现它并不像echo打印到一行,会打印成多行。
  -s: 伪造命令历史,比如history -s rm -rf /opt,这样写并不会执行删除opt目录的操作,只是把这条没有执行的"命令"加入到了历史中。
  

  

  history命令的相关文件
  当我们输入history命令,history会将命令历史返回给我们,当我们重启机器后,再次执行history命令,还是会返回历史命令,证明历史命令是存在于某个文件中的,这个文件就是
  ~/.bash_history
  每个用户家目录中都有一个隐藏文件,.bash_history  ,历史命令最终都存放在此文件中。
  我们先使用history命令查看,可以看到当前登录后的一些命令历史,但是我们查看.bash_history却没有发现当前登录后的历史命令,这是因为本次登录后执行的命令历史存放在内存中,当我们退出本次会话,本次会话的命令历史才会从内存写入到.bash_history文件中,使用-a参数可以不退出当前会话,即可将内存中的历史命令追加到历史文件中。
  由此也可见,命令历史会在登陆后从历史文件中被加载到内存中,可以理解为有两个地方存放。
  

  /etc/profile  
  此文件中配置了history命令的相关变量,在此文件中配置的history命令的变量全局生效。
  

  ~/.bash_profile
  如果在此文件中重复配置/etc/profile中配置过的history的相关变量,那么以此文件中的配置为准,此文件中的命令历史相关配置只对当对应用户有效。
  

  

  history命令的相关变量
  HISTSIZE变量,用于history命令最多显示多少条命令历史。
  HISTSIZE=1000,表示内存中最多缓存加载1000条命令历史,也就是说history命令返回最多1000条命令,可是我们使用history命令查看的时候,却可能发现命令已经记录到了1041条,这并不是我们的设置没有生效或者发生错误,而是“最开始的1到41条”已经被挤出了命令历史,序号是从“41”开始的,所以记录到1041条正好是1000条,如果设置 HISTSIZE=0 代表永远不记录历史。
  

  HISTFILESIZE变量,用于配置~/.bash_history中最多保存多少条历史。
  centos6中 ,HISTSIZE 和 HISTFILESIZE默认都是1000,但是 HISTFILESIZE 我们可以稍微设置大一点,这样能保存更多的历史,而且~/.bash_history是存放在硬盘中的,所以即使设置的条目数量很大,对于现在的硬盘容量来说,也是比较小的,当然,太大的话读取也会很慢,但是HISTSIZE就不要设置的太大,因为个人觉得HISTSIZE设置过大没有必要,还占用内存资源。
  

  HISTTIMEFORMAT变量,用于配置命令历史的时间格式。
  HISTTIMEFORMAT="%F  %T  "  这样设置HISTTIMEFORMAT变量是设置历史命令的时间格式的,当然,我们也可以灵活运用,加入一些自己想要显示的信息,比如:HISTTIMEFORMAT="`hostname` %F  %T  ",可以理解为格式化历史命令的显示方式,此例中的格式表示在命令历史前加入 主机名 、日期、时间等信息。
  

  HISTIGNORE变量,指定不记录到历史中的命令。
  HISTIGNORE="cmd1:cmd2:…"    表示忽略cmd1,cmd2这些命令,cmd1和cmd2将不被记录在命令历史中,但是如果你对cmd1加选项和参数的话,还是会被记录到历史中,除非你只使用cmd1,不加任何选项和参数。
  

  HISTFILE变量,指定存放历史的文件。
  HISTFILE=/root/his.log  指定记录历史的文件,默认存储命令历史的文件为用户家目录下的.bash_history
  

  HISTCONTROL  变量 ,控制历史记录的方式的变量。
  通过设置 环境变量:HISTCONTROL  可以控制历史的记录方式,HISTCONTROL  变量可以设置成如下值。
   ignoredups 不记录“重复”的命令;连续且相同 方为“重复”
   ignorespace 不记录所有以空格开头的命令,此变量值非常实用,我们可以通过临时更改HISTCONTROL 的变量值为ignorespace ,
              以便当前会话中的以空格开头不被记录到历史中。
   ignoreboth 表示ignoredups:ignorespace ,效果相当于以上两种的组合。
   erasedups  删除重复命令
  

  

  

  

  怎样快速执行上一条命令
  有 4 种方法可以重复执行上一条命令:
  1、使用上方向键,并回车执行。
  2、按 !! 并回车执行。
  3、输入 !-1 并回车执行。
  4、按 Ctrl+P 并回车执行。
  

  

  调用特定的历史命令的方法
  !!重复前一个命令
  ! 字符重复前一个以“字符”开头的命令
  !num按照历史记录的序号执行命令
  !?abc重复之前包含abc的命令
  !-n执行命令历史列表中的倒数第n条命令,!-1代表上一条命令
  

  

  调用历史命令的参数的方法
  #cmd !^ 或者#cmd !!^       : 利用上一个命令的第一个参数做cmd的参数
  #cmd !$ 或者#cmd !!$       : 利用上一个命令的最后一个参数做cmd的参数
  #cmd !* 或者#cmd !!*       : 利用上一个命令的全部参数做cmd的参数
  #cmd !:n或者#cmd !!:n      : 利用上一个命令的第n个参数做cmd的参数
  

  #cmd !n:^ 调用第n条命令的第一个参数做cmd的参数
  #cmd !n:$ 调用第n条命令的最后一个参数做cmd的参数
  #cmd !m:n 调用第m条命令的第n个参数做cmd的参数
  #cmd !n:* 调用第n条命令的所有参数做cmd的参数
  

  #cmd !string:^ 从命令历史中搜索以 string 开头的命令,并获取 它的第一个参数,当做cmd的参数
  #cmd !string:$ 从命令历史中搜索以 string 开头的命令,并获取它 的最后一个参数,当做cmd的参数
  #cmd !string:n 从命令历史中搜索以 string 开头的命令,并获取 它的第n个参数,当做cmd的参数
  #cmd !string:* 从命令历史中搜索以 string 开头的命令,并获取 它的所有参数,当做cmd的参数
  

  从上述语法可以看出
  调用历史命令的方法  和 调用历史命令参数的方法 是可以互相组合的
  

  

  一些相关的快捷键
  ctrl键 + r    快捷键可以从命令历史中查找(reverse-i-search)
  按(Alt+.)或者(按esc后松手,再按.)可以调用上一个命令的最后一个参数。
  

  注意:
  历史扩展只能用在交互shell,不能用在shell脚本中
  

  

  一些小例子
  history命令应用的小例子
  我们通常会打开多个远程命令行窗口连接到一台主机进行操作,这样更方便,假设我通过ssh远程工具,打开了两个远程窗口,窗A、窗B
  加入我们一开始在窗A执行了一些命令,然后切换到窗B,在窗B中又执行了一些不同的命令。
  那么这时候我们在窗B中使用history命令查看历史命令,会发现窗A中执行过的命令并没有在窗B中的history中显示。
  我们可以通过如下方法,将窗A中的命令历史同步到窗B中
  1、在窗A中执行history -a将内存中的命令写入到历史文件中
  2、在窗B中执行history -n ,从历史文件中将新增历史命令加载到窗B的内存历史列表中
  3、在窗B中执行history命令,已经可以看到窗A中执行过的命令
  

  调用历史命令参数的小例子
mkdir a b c
cd !!:1
cd a  

mkdir a b c
cd !!:2
cd b  

mkdir a b c
cd !$
cd c  

  注意:
  历史扩展只能用在交互shell,不能用在shell脚本中
  

  !$是引用上一个命令的最后一个参数
  $_是引用前一个命令的最后一个参数
  一个是前一个命令一个是上一个命令
  例如

mkdir -p testdir && cp -r  /opt "$_"  

  




马哥教育Linux学习笔记

http://www.magedu.com/
http://mageedu.blog.51cto.com




.
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-462289-1-1.html 上篇帖子: Linux 信号(上) 下篇帖子: Linux 的文件系统
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表