像所有shell一樣,Linux命令行終端保留用戶過去執行的命令的曆史記錄(bash history)。此曆史記錄是永久性的,即使重新啟動係統也會保留在內存中。這些存儲的命令可以自由重複使用。
使用bash曆史記錄(history)的命令是“history”。此命令是內置 bash命令,用於提取有關Linux用戶在所有先前會話中已執行的命令的曆史記錄信息。在本教程中,我們將通過學習history命令的正確用法來使您充分利用shell曆史。 Linux默認將特定用戶的命令曆史記錄存儲在〜/.bash_history文件中。
查看整個曆史
用戶可以使用以下簡單命令,查看shell命令的整個曆史記錄:
$ history
曆史記錄將以以下默認格式打印在屏幕上:
在上圖中,您可以看到所有命令的列表,並為每個命令分配了一個編號。數字1命令對應於您運行的第一個命令,最後一個編號的命令代表您執行的最新命令。
如果自從使用bash以來一直在運行許多命令,您會發現這裏將顯示成百上千個這樣的命令。要訪問一些相關命令,您可以過濾曆史記錄功能顯示的結果。
過濾曆史記錄輸出
如果要基於先前命令中可能使用的特定關鍵字過濾曆史記錄輸出,則可以按以下方式使用history命令:
$ history | grep [keyword]
例:在此示例中,我隻想查看在 shell 中運行過的ping命令。因此,我將使用以下命令:
$history | grep ping
您可以看到我的輸出現在僅顯示包含搜索關鍵字“ping”的命令
查看許多最近的命令
您還可以查看特定數量的命令,例如:
- N個最近的命令
或者
- N個最舊的命令
N最近的命令
您可以通過以下命令查看特定數量的最近運行的命令:
$ history | tail -n
例:
在此示例中,我想用關鍵字“ ping”查看我運行的最後3條命令:
$ history | grep ping |tail -3
輸出僅顯示3個最近的ping命令,而不是整個曆史記錄
N個最舊的命令
您可以通過以下命令查看特定數量的最早的運行命令:
$ history | head -n
例:
在此示例中,我想查看我運行的最舊的3條命令,關鍵字為“ ping”:
$ history | grep ping |head -3
輸出僅顯示3個最舊的ping命令,而不是整個曆史記錄
列出所有帶有日期和時間戳的命令
如果要查看命令曆史記錄以及日期和時間戳,請使用以下導出命令:
$ export HISTTIMEFORMAT='%F, %T'
現在,當您希望查看曆史記錄時,隻需運行history命令以以下格式查看輸出:
請注意,此格式更改是臨時的,關閉會話後將恢複為以前的標準。
從曆史導航命令
在命令行上時,您可以瀏覽以前運行的命令,也可以通過提供關鍵字來調用一些最近使用的命令。
滾動瀏覽命令
您可以使用鍵盤命令瀏覽曆史記錄命令
向上箭頭/Ctrl + P | 顯示以前使用的命令。您可以多次點擊這些控件以返回到曆史記錄中的特定命令。 | |
向下箭頭/Ctrl + N | 顯示您使用的下一個命令。您可以多次點擊這些控件以前進到曆史記錄中的特定命令。 | |
ALT + R | 如果在當前行上編輯從曆史記錄中拉出的命令,則可以使用此控件將其還原為原始命令。 |
調出命令
您可以使用以下組合鍵從曆史記錄中調用、運行或選擇不運行特定命令:
CTRL + R | 通過指定搜索字符串從曆史記錄中調用命令。 |
CTRL + O | 運行通過Ctrl + R調用的命令 |
CTRL + G | 退出曆史記錄,而無需運行通過Ctrl + R調用的命令 |
例:
在此示例中,我按了CTRL + R,然後提供了搜索字符串“ ar”。曆史記錄顯示命令“ arch”。
通過按ctrl + O運行命令“ arch”時,它顯示了我係統的CPU體係結構:
history進階
bash曆史記錄的真正魅力在於使用各種命令並自定義history命令本身以充分利用曆史記錄功能:
從曆史記錄運行命令
- 如前所述,history命令通過將數字與每個命令相關聯來顯示命令。通過使用以下命令,您可以根據其曆史記錄從曆史記錄中運行某個命令:
$ !#
例:
在這裏,我從曆史記錄中運行命令號95:
$ !95
輸出顯示“ lscpu”的結果,該結果在我的bash曆史記錄中列為命令編號95。此命令顯示我的CPU和操作係統規格。
- 您可以使用以下命重新執行上一個命令:
$ !!
例:
在這裏,您可以看到我運行了“ arch”命令。通過運行上述命令,我可以使用重新執行’arch’命令來查看我的CPU體係結構,如下所示:
- 為了從曆史記錄中搜索命令,然後運行它,請使用以下命令:
$ ![keyword]
例:
我將使用以下命令對最後一個帶有關鍵字“ dconf”的命令重新執行:
$ !dconf
您可以在下圖中顯示,它的確是我運行的最後一個dconf命令。
使用先前命令中的參數
Linux bash使您可以使用上一個命令中的參數來運行新命令。當您要避免重新輸入冗長或複雜的參數時,它特別有用。為此,可以使用以下命令:
使用上一個命令的最後一個參數
$ [Command] !$
變量!$中存儲了前一個命令的最後一個參數。
例:
在此示例中,我將創建一個長名稱的文件。
Nano [longnameOfaFile]
然後,通過避免再次按以下方式鍵入長名稱,我將其複製到另一個位置:
Cp !$ [destinationfolder]
您可以看到我可以使用變量!$複製文件而無需重新輸入文件名!
使用上一個命令的第一個參數
有時,隻有前一個命令的第一個參數對當前命令有幫助。
在這種情況下,可以使用以下命令:
$ [command] !^
例:
在以下示例中,我通過指定主機名和計數作為參數來運行ping命令。現在,我想在新命令中使用主機名(第一個參數)而不是2(最後一個參數)。為此,我將使用以下命令:
$ ping !^
使用上一個命令的所有參數
您還可以通過使用以下命令來使用上一命令中的所有參數:
$ !*
使用曆史命令中的一個參數
您還可以使用曆史記錄中的命令的某個參數。為此,請使用以下命令:
$ [command] ![keyword]:#
例:
$ echo !cp:2
該命令將采用以下參數:
命令:echo
關鍵字:cp [搜索的曆史命令的關鍵詞,取最後一個匹配的命令]
#:2(命令的第二個參數)
以下輸出顯示了我運行的最後一個cp命令的第二個參數:
使用曆史命令中的所有參數
以下命令將存儲搜索到的history命令中的所有參數,並在當前命令中使用它們:
$ command ![keyword]:*
例:
在以下命令中,我將使用echo命令打印最後一個cp命令的所有參數,如下所示:
$ echo ![cp]:*
修改和運行以前的命令
如果您鍵入了錯誤的命令,或者想通過更改其中的一些文本來對命令再次執行;以下是這樣做的方法:
$ ^[previoustext]^[newtext]
例:
我將命令“ grep”錯誤鍵入為“ gep”,現在我想通過更正文本來運行命令:
$ ^gep^grep
現在您可以看到我的更正命令將按如下所示正確運行:
清楚history記錄
為了清除bash的曆史記錄,請使用以下命令:
$ history -c
此命令將清除您的曆史記錄並從文件〜/.bash_history中刪除所有內容
在本教程中,我們了解到,雖然打印整個曆史記錄內容可能沒有用,但通過我們學到的命令優化輸出還是非常有用的。