每天一個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: 刪除重複命令