Linux基礎知識之history的詳細說明

背景:history是Linux中常會用到內容,在工做中一些用戶會忽然發現其安裝不了某個軟件,因而尋求運維人員的幫助,而不給你說明他到底作了哪些坑爹的操做。此時你第一件要作的就是要查看其history命令歷史。查看後興許你就會發現他到底幹了什麼坑爹的操做。
history可讓你在必定狀況下快速定位問題所在。linux

本文的history介紹及其實踐都是來自CentOS7.2環境
[root@localhost ~]# cat /etc/RedHat-release  
CentOS Linux release 7.2.1511 (Core)
shell

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 
  ... 
  .. 
  .
bash

系統在關閉後會將現有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:    刪除重複命令
測試

讓上述環境變量生效方式:
一、直接在當前shell內輸入相關變量,好比咱們不想留存命令歷史,咱們把HISTSIZE設置爲0
[root@localhost ~]# HISTSIZE=0 
[root@localhost ~]# history
spa

經測試,成功。不過這種設置的侷限性是其做用範圍僅僅針對當前shell及其子shell,若是切換用戶或登出再登入其設置失效。不過其特色是設置完馬上生效。
下面經過實驗說明這個問題
[root@localhost ~]# bash 
[root@localhost ~]# history 
[root@localhost ~]# history
rest

以上結果說明在當前shell內設置history的環境變量後,其做用範圍爲當前shell及子shell
Last login: Fri Jul 29 17:26:41 2016 from 10.1.250.62 
[root@localhost ~]# history 
    1  history
ip

從新登錄後原有的history環境變量失效
二、另外一種讓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
ci

由結果可知變量並無生效,咱們從新登陸再嘗試下。
[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,.咱們在建立文件後,一般會對其進行修改或其餘的讀操做,這時候鍵入命令後利用上述快捷鍵便可快速補全所需命令。

相關文章
相關標籤/搜索