每天一個linux命令:history

每天一個linux命令:history

更多精彩請關注:www.zicreate.com

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.txt
zicreate.txt
$ vim !!:$
vim zicreate.txt

補充:使用 !$ 可以達到同樣的效果,而且更簡單。
!# 上一個命令名
!^上一個命令的第一個參數
!$上一個命令的最後一個參數
!:n上一個命令的第n個參數

搜索,!cp:2 從命令歷史中搜索以 cp 開頭的命令,並獲取它的第二項參數:

$ cp zicreate.txt /tmp/zicreate.txt
$ ls -l !cp:2
ls -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:           刪除重複命令
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章