背景:history是Linux中常会用到内容,在工作中一些用户会突然发现其安装不了某个软件,于是寻求运维人员的帮助,而不给你说明他到底做了哪些坑爹的操作。此时你第一件要做的就是要查看其history命令历史。查看后兴许你就会发现他到底干了什么坑爹的操作。

history可以让你在一定情况下快速定位问题所在。

本文的history介绍及其实践都是来自CentOS7.2环境

[root@localhost ~]# cat /etc/RedHat-release

CentOS Linux release 7.2.1511 (Core)

history的介绍

history是shell的内置命令,其内容在系统默认的shell的man手册中。

history是显示在终端输入并执行的过命令,系统默认保留1000条。

[root@localhost ~]# history

1  ls

2  vi /etc/sysconfig/network-scripts/ifcfg-eno16777728

3  service network restart

4  ifconfig

5  ping www.linuxidc.com

6  systemctl disable firewalld.service

7  systemctl stop firewalld.service

8  exit

9  ls

10  type which

11  which ls

12  file /usr/bin/ls

13  which clock

14  file /usr/sbin/clock

15  man which

16  man what

17  man who

18  who

19  man who

20  man w

21  man who

22  who -q

23  man w

...

..

.

系统在关闭后会将现有history内容保存在文件~/.bash_history

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

让上述环境变量生效方式:

1、直接在当前shell内输入相关变量,比如我们不想留存命令历史,我们把HISTSIZE设置为0

[root@localhost ~]# HISTSIZE=0

[root@localhost ~]# history

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

下面通过实验说明这个问题

[root@localhost ~]# bash

[root@localhost ~]# history

[root@localhost ~]# history

以上结果说明在当前shell内设置history的环境变量后,其作用范围为当前shell及子shell

Last login: Fri Jul 29 17:26:41 2016 from 10.1.250.62

[root@localhost ~]# history

1  history

重新登陆后原有的history环境变量失效

2、另一种让history环境变量生效的方式是修改~/.bash_profile文件

[root@localhost ~]# vi ~/.bash_profile

# .bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

HISTTIMEFORMAT="%F %T "        此为新添加的history环境变量,我添加了发生命令操作的时间

export PATH

wq保存退出。

[root@localhost ~]# history

1  history

2  ll

3  cd

4  hostory

5  history

6  vi ~/.bash_profile

7  history

由结果可知变量并没有生效,我们重新登录再尝试下。

[root@localhost ~]# history

1  2016-07-29 20:00:29 history

2  2016-07-29 20:00:29 ll

3  2016-07-29 20:00:29 cd

4  2016-07-29 20:00:29 hostory

5  2016-07-29 20:00:29 history

6  2016-07-29 20:00:29 vi ~/.bash_profile

7  2016-07-29 20:00:29 history

8  2016-07-29 20:00:29 logout

9  2016-07-29 20:00:33 history

通过上面的两个结果,我们可以发现第二种修改配置文件虽然也可以成功修改history环境变量但是其生效需要重新登陆,并不是改完就生效。但是它的特点是此修改始终有效,时效性为永久。

history命令的使用

-c: 清空命令历史

-d n: 删除历史中指定的命令,n表示命令号

#: 显示最近的#条历史

-a: 追加本次会话新执行的命令历史列表至历史文件,因为多终端所以如果想看当前都发生了什么操作就可以执行-a进行查看

-n: 读历史文件(本地数据)中未读过的行到历史列表(内存数据)

-r: 读历史文件(本地数据)附加到历史列表(内存数据)

-w: 保存历史列表(内存数据)到指定的历史文件(本地数据)

-s: 展开历史参数成一行,附加在历史列表后。用于伪造命令历史

下面来演示上面几种命令的使用

[root@localhost ~]# history

1  2016-07-29 20:00:29 history

2  2016-07-29 20:00:29 ll

3  2016-07-29 20:00:29 cd

4  2016-07-29 20:00:29 hostory

5  2016-07-29 20:00:29 history

6  2016-07-29 20:00:29 vi ~/.bash_profile

7  2016-07-29 20:00:29 history

8  2016-07-29 20:00:29 logout

9  2016-07-29 20:00:33 history

10  2016-07-29 20:07:41  cd

11  2016-07-29 20:07:44  ls

12  2016-07-29 20:07:50  history

13  2016-07-29 20:08:12 cat /etc/profile

14  2016-07-29 20:12:10 HISTCONTROL=ignorespace

15  2016-07-29 20:27:28 history -p

16  2016-07-29 20:27:31 history

17  2016-07-29 20:28:10 ls /etc

18  2016-07-29 20:28:14 history

19  2016-07-29 20:28:57 history

清空历史

[root@localhost ~]# history -c

[root@localhost ~]# history

2016-07-29 20:29:26 history

从历史文件读取之前的命令历史

[root@localhost ~]# history -r

[root@localhost ~]# history

1  2016-07-29 20:29:26 history

2  2016-07-29 20:30:59 history -r

3  2016-07-29 20:30:59 history

4  2016-07-29 20:30:59 ll

5  2016-07-29 20:30:59 cd

6  2016-07-29 20:30:59 hostory

7  2016-07-29 20:30:59 history

8  2016-07-29 20:30:59 vi ~/.bash_profile

9  2016-07-29 20:30:59 history

10  2016-07-29 20:30:59 logout

11  2016-07-29 20:31:01 history

删除指定命令历史

[root@localhost ~]# history -d 4

[root@localhost ~]# history

1  2016-07-29 20:29:26 history

2  2016-07-29 20:30:59 history -r

3  2016-07-29 20:30:59 history

4  2016-07-29 20:30:59 cd

5  2016-07-29 20:30:59 hostory

6  2016-07-29 20:30:59 history

7  2016-07-29 20:30:59 vi ~/.bash_profile

8  2016-07-29 20:30:59 history

9  2016-07-29 20:30:59 logout

10  2016-07-29 20:31:01 history

11  2016-07-29 20:32:50 history -d 4

12  2016-07-29 20:32:52 history

伪造历史命令

12345678910111213141516 [root@localhost ~]# history -s rm -rf /*  做下恶作剧

[root@localhost ~]# history

1  2016-07-29 20:29:26 history

2  2016-07-29 20:30:59 history -r

3  2016-07-29 20:30:59 history

4  2016-07-29 20:30:59 cd

5  2016-07-29 20:30:59 hostory

6  2016-07-29 20:30:59 history

7  2016-07-29 20:30:59 vi ~/.bash_profile

8  2016-07-29 20:30:59 history

9  2016-07-29 20:30:59 logout

10  2016-07-29 20:31:01 history

11  2016-07-29 20:32:50 history -d 4

12  2016-07-29 20:32:52 history

13  2016-07-29 20:33:57 rm -rf /bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var

14  2016-07-29 20:34:00 history

我相信任谁输入history看到这个命令都会吓一身汗。

调用历史参数详解

#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 开头的命令,并获取它的所有参数

下面通过实验来实践上面的历史参数的具体用法

[root@localhost ~]# history

1  2016-07-29 20:29:26 history

2  2016-07-29 20:30:59 history -r

3  2016-07-29 20:30:59 history

4  2016-07-29 20:30:59 cd

5  2016-07-29 20:30:59 hostory

6  2016-07-29 20:30:59 history

7  2016-07-29 20:30:59 vi ~/.bash_profile

8  2016-07-29 20:30:59 history

9  2016-07-29 20:30:59 logout

10  2016-07-29 20:31:01 history

11  2016-07-29 20:32:50 history -d 4

12  2016-07-29 20:32:52 history

13  2016-07-29 20:33:57 rm -rf /bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var

14  2016-07-29 20:34:00 history

15  2016-07-29 20:40:32 ls

16  2016-07-29 20:40:33 cd

17  2016-07-29 20:40:45 ls /etc/passwd

18  2016-07-29 20:41:35 history

我们先使用!!来调用上一条命令

[root@localhost ~]# !!

history

1  2016-07-29 20:29:26 history

2  2016-07-29 20:30:59 history -r

3  2016-07-29 20:30:59 history

4  2016-07-29 20:30:59 cd

5  2016-07-29 20:30:59 hostory

6  2016-07-29 20:30:59 history

7  2016-07-29 20:30:59 vi ~/.bash_profile

8  2016-07-29 20:30:59 history

9  2016-07-29 20:30:59 logout

10  2016-07-29 20:31:01 history

11  2016-07-29 20:32:50 history -d 4

12  2016-07-29 20:32:52 history

13  2016-07-29 20:33:57 rm -rf /bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var

14  2016-07-29 20:34:00 history

15  2016-07-29 20:40:32 ls

16  2016-07-29 20:40:33 cd

17  2016-07-29 20:40:45 ls /etc/passwd

18  2016-07-29 20:41:35 history

[root@localhost ~]# !h

history

1  2016-07-29 20:29:26 history

2  2016-07-29 20:30:59 history -r

3  2016-07-29 20:30:59 history

4  2016-07-29 20:30:59 cd

5  2016-07-29 20:30:59 hostory

6  2016-07-29 20:30:59 history

7  2016-07-29 20:30:59 vi ~/.bash_profile

8  2016-07-29 20:30:59 history

9  2016-07-29 20:30:59 logout

10  2016-07-29 20:31:01 history

11  2016-07-29 20:32:50 history -d 4

12  2016-07-29 20:32:52 history

13  2016-07-29 20:33:57 rm -rf /bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var

14  2016-07-29 20:34:00 history

15  2016-07-29 20:40:32 ls

16  2016-07-29 20:40:33 cd

17  2016-07-29 20:40:45 ls /etc/passwd

18  2016-07-29 20:41:35 history

19  2016-07-29 20:47:03 history

20  2016-07-29 20:48:22 history

大家感兴趣可以一个个实验。本文就介绍到这里。

常用的快捷键

重新调用前一个命令中最后一个参数:

!$

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

这两个很常用,特别是Esc,.

我们在创建文件后,通常会对其进行修改或其他的读操作,这时候键入命令后利用上述快捷键即可快速补全所需命令。

history linux 位置,Linux基础知识之history的详细说明相关推荐

  1. 【嵌入式Linux】嵌入式Linux应用开发基础知识之I2C应用编程和SMBus协议及AP3216C应用编程

    文章目录 前言 1.IIC协议和SMBUS协议 1.1.IIC协议 1.1.1.硬件框架 1.1.2.软件框架 1.1.3.读写数据格式 1.1.4.硬件结构--在硬件上是如何实现双向传输 1.2.S ...

  2. 【嵌入式Linux】嵌入式Linux应用开发基础知识之输入系统应用编程

    文章目录 前言 1.输入系统应用编程 1.1.输入系统框架及调试 1.1.1.框架概述 1.1.2.编写APP需要的基础知识 1.2.调试技巧 1.2.1.查看设备信息 1.2.2.使用命令查看节点数 ...

  3. Linux网络编程基础知识

    Linux网络编程基础知识 1. 协议的概念 1.1 什么是协议 1.2 典型协议 2 网络应用程序设计模式 2.1 C/S模式 2.2 B/S模式 2.3 优缺点 3 分层模型 3.1 OSI七层模 ...

  4. Linux 操作系统编程基础知识

    Linux操作系统 1.Linux 操作系统编程基础知识 1.3 系统调用和库函数 1.3.1 接口 命令接口:以命令形式呈现在用户面前,方便用户直接或间接控制自己的作业. 程序接口:为应用程序使用系 ...

  5. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之Pinctrl子系统和GPIO子系统的使用

    文章目录 前言 1.Pinctrl子系统 1.1.为什么有Pinctrl子系统 1.2.重要的概念 1.3.代码中怎么引用pinctrl 2.GPIO子系统 2.1.为什么有GPIO子系统 2.2.在 ...

  6. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之按键驱动框架

    文章目录 前言 1.APP怎么读取按键值 1.1.查询方式 1.2.休眠-唤醒方式 1.3.poll方式 1.3.异步通知方式 1.5. 驱动程序提供能力,不提供策略 2.按键驱动程序框架--查询方式 ...

  7. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树

    文章目录 前言 1.驱动的三种编写方法 2.怎么使用设备树写驱动程序 2.1.设备树节点要与platform_driver能匹配 2.2.修改platform_driver的源码 3.实验和调试技巧 ...

  8. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型

    文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...

  9. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之总线设备驱动模型

    文章目录 前言 1.驱动编写的三种方法 1.1.传统写法 1.2.总线驱动模型 1.3.设备树驱动模型 2.Linux实现分离:Bus/Dev/Drv模型 2.1.Bus/Dev/Drv模型 2.2. ...

  10. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之驱动设计的思想:面向对象/分层/分离

    文章目录 前言 1.分离设计 驱动程序分析---程序分层 通用驱动程序---面向对象 个性化驱动程序---分离 APP 程序分析 前言 韦东山嵌入式Linux驱动开发基础知识学习笔记 文章中大多内容来 ...

最新文章

  1. Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明
  2. c语言对10求余不为7,【PTA | 基础编程题目集】7-12 两个数的简单计算器 (10分)
  3. Failed to load resource: net::ERR_INSECURE_RESPONSE 问题解决记录
  4. android编程读取sd卡txt文件,如何读取SD卡中的txt文件?
  5. java设计模式--简单工厂设计模式SimpleFactoryPattern
  6. Anaconda自带Python编译器Jupyter Notebook显示代码行数
  7. 【资源下载】921页《用Python3带你从小白入门机器学习实战》教程手册
  8. 【BZOJ1800】飞行棋,没有最好(ge pi)只有更好
  9. 每天一学——VAB RANGE
  10. 汇编语言王爽实验十三
  11. JAVA实现网页版斗地主_Java实现斗地主最简代码实例
  12. GeoTrans2.4.1 用户手册 之 入门
  13. Solr之Facet与FacetPivot的使用和区别
  14. 1路编码器脉冲计数器或2路DI高速计数器,Modbus RTU模块 WJ150
  15. android实现从耳机和自带麦克风,android插上耳机的时候仍然使用机身的麦克风录音,解决!...
  16. C++ 实用趣味小程序
  17. 查找附近的xxx 球面距离以及Geohash方案探讨
  18. springboot 实现图片上传功能
  19. 【课设分享】基于51单片机的恒温控制器系统
  20. Centos7 更改Apache默认网站目录

热门文章

  1. 街篮最新服务器,街头篮球各区的服务器IP多少
  2. word文件打不开,千万别删除!教你轻松修复
  3. EMC传导骚扰的共模电流与差模电流
  4. The perfect floor chair
  5. 网站出现502 BAD GATEWAY的解决办法
  6. 湖北政务服务“一张网”实现五级联通 便民事项掌上办
  7. 留给19371213看的
  8. Macbook 2021 M1pro 安装 SentencePiece
  9. 周杰伦他什么都知道!
  10. 开始做公众号的一些方法技巧总结