Shell history詳解:檢視歷史命令

2020-07-16 10:04:34
Bash 有完善的歷史命令,這對於簡化管理操作、排查系統錯誤都有重要的作用,而且使用簡單方便,建議大家多使用歷史命令。系統儲存的歷史命令可以使用 history 命令查詢,命令格式如下:

[[email protected] ~]# history [選項] [歷史命令儲存檔案]

選項:
  • -c:清空歷史命令;
  • -w:把快取中的歷史命令寫入歷史命令儲存檔案中。如果不手工指定歷史命令儲存檔案,則放入預設歷史命令儲存檔案 ~/.bash_history 中;

如果 history 命令直接回車,則用於查詢系統中的歷史命令,命令如下:

[[email protected] ~]# history
…省略部分輸出…
421 chmod 755 hello.sh
422/root/sh/hello.sh
423 ./hello.sh
424 bash hello.sh
425 history

這樣就可以查詢我們剛剛輸入的系統命令,而且每條命令都是有編號的。歷史命令預設會儲存 100 條,這是通過環境變數 HISTSIZE 進行設定的,我們可以在環境變數組態檔 /etc/profile 中進行修改。命令如下:

[[email protected] ~]#vi /etc/profile
…省略部分輸出…
HISTSIZE=1000
…省略部分輸出…

如果覺得 1000 條歷史命令不夠曰常管理使用,那麼是否可以増加呢?只需修改 /etc/profile 環境變數組態檔中的 HISTSIZE 欄位即可,不過我們需要考慮一個問題:這些歷史命令是儲存在哪裡的呢?如果歷史命令是儲存在檔案中的,那麼歷史命令的儲存數量可以放心地增加,因為哪怕有幾萬條歷史命令,也不會佔用多大的硬碟空間。但是,如果歷史命令是儲存在記憶體當中的,就要小心了。好在歷史命令是儲存在 ~/.bash_history 檔案中的,所以可以放心地把總歷史命令條數改大,比如 10 000 條,命令如下:

[[email protected] ~]#vi /etc/profile
…省略部分輸出…
HISTSIZE=10000
…省略部分輸出…

大家需要注意,每個使用者的歷史命令是單獨儲存的,所以每個使用者的家目錄中都有 .bash_history 這個歷史命令檔案。

如果某個使用者的歷史命令總了歷史命令儲存條數,那麼新命令會變成最後一條命令,而最早的命令則被刪除。假設系統儲存 1000 條歷史命令,而我已經儲存了 1000 條歷史命令,那麼我新輸入的命令會被儲存成第 1000 條命令,而最早的第一條命令會被刪除。

還要注意一下,我們使用 history 命令檢視的歷史命令和 ~/.bash_history 檔案中儲存的歷史命令是不同的。那是因為當前登入操作的命令並沒有直接寫入 ~/.bash_history 檔案中,而是儲存在快取當中的,需要等當前使用者登出之後,快取中的命令才會寫入 ~/.bash_history 檔案中。

如果我們需要把記憶體中的命令直接寫入 ~/.bash_history 檔案中,而不等使用者登出時再寫入,就需要使用"-w"選項。命令如下:

[[email protected] ~]# history -w
#把快取中的歷史命令直接寫入~/.bash_history

這時再去查詢 ~/.bash_history 檔案,歷史命令就和 history 命令查詢的結果一致了。

如果需要清空歷史命令,則只需要執行如下命令:

[[email protected] ~]# history -c
#清空歷史命令

這樣就會把快取和 ~/.bash_history 檔案中的歷史命令清空。

歷史命令的呼叫

如果想要使用原先的歷史命令,則有這樣幾種方法:
  • 使用上、下箭頭呼叫以前的歷史命令。
  • 使用"!n"重複執行第 n 條歷史命令。

[[email protected] ~]# history
…省略部分輸出…
421 chmod 755 hello.sh
422/root/sh/hello.sh
423 ./hello.sh
424 bash hello.sh
425 history
[[email protected] sh]# !424
#重複執行第424條命令

  • 使用"!!"重複執行上一條命令。

[[email protected] sh]#!!
#如果接著上一條命令,則會把424命令再執行一遍

  • 使用"!字串"重複執行最後一條以該字串開頭的命令。

[[email protected] sh]#!bash
#重複執行最後一條以bash開頭的命令,也就是第424條命令bash hello.sh

  • 使用"!$"重複上一條命令的最後一個引數。

[[email protected] ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
#檢視網絡卡組態檔內容
[[email protected] ~]# vi !$
# "!$"代表上一條命令的最後一個引數,也就是/etc/sysconfig/network-scripts/ifcfg-eth0