當前位置: 首頁>>係統&架構>>正文


Linux Bash history從入門到進階

像所有shell一樣,Linux命令行終端保留用戶過去執行的命令的曆史記錄(bash history)。此曆史記錄是永久性的,即使重新啟動係統也會保留在內存中。這些存儲的命令可以自由重複使用。

使用bash曆史記錄(history)的命令是“history”。此命令是內置 bash命令,用於提取有關Linux用戶在所有先前會話中已執行的命令的曆史記錄信息。在本教程中,我們將通過學習history命令的正確用法來使您充分利用shell曆史。 Linux默認將特定用戶的命令曆史記錄存儲在〜/.bash_history文件中。

查看整個曆史

用戶可以使用以下簡單命令,查看shell命令的整個曆史記錄:

$ history

曆史記錄將以以下默認格式打印在屏幕上:

View entire bash history

在上圖中,您可以看到所有命令的列表,並為每個命令分配了一個編號。數字1命令對應於您運行的第一個命令,最後一個編號的命令代表您執行的最新命令。

如果自從使用bash以來一直在運行許多命令,您會發現這裏將顯示成百上千個這樣的命令。要訪問一些相關命令,您可以過濾曆史記錄功能顯示的結果。

過濾曆史記錄輸出

如果要基於先前命令中可能使用的特定關鍵字過濾曆史記錄輸出,則可以按以下方式使用history命令:

$ history | grep [keyword]

例:在此示例中,我隻想查看在 shell 中運行過的ping命令。因此,我將使用以下命令:

$history | grep ping

Filtering the History Output

您可以看到我的輸出現在僅顯示包含搜索關鍵字“ping”的命令

查看許多最近的命令

您還可以查看特定數量的命令,例如:

  • N個最近的命令

或者

  • N個最舊的命令

N最近的命令

您可以通過以下命令查看特定數量的最近運行的命令:

$ history | tail -n

例:

在此示例中,我想用關鍵字“ ping”查看我運行的最後3條命令:

$ history | grep ping |tail -3

Show Number of Recent Commands

輸出僅顯示3個最近的ping命令,而不是整個曆史記錄

N個最舊的命令

您可以通過以下命令查看特定數量的最早的運行命令:

$ history | head -n

例:

在此示例中,我想查看我運行的最舊的3條命令,關鍵字為“ ping”:

$ history | grep ping |head -3

Show Oldest Commands

輸出僅顯示3個最舊的ping命令,而不是整個曆史記錄

列出所有帶有日期和時間戳的命令

如果要查看命令曆史記錄以及日期和時間戳,請使用以下導出命令:

$ export HISTTIMEFORMAT='%F, %T'

現在,當您希望查看曆史記錄時,隻需運行history命令以以下格式查看輸出:

List All Commands with Date and Timestamp

請注意,此格式更改是臨時的,關閉會話後將恢複為以前的標準。

從曆史導航命令

在命令行上時,您可以瀏覽以前運行的命令,也可以通過提供關鍵字來調用一些最近使用的命令。

滾動瀏覽命令

您可以使用鍵盤命令瀏覽曆史記錄命令

向上箭頭/Ctrl + P 顯示以前使用的命令。您可以多次點擊這些控件以返回到曆史記錄中的特定命令。
向下箭頭/Ctrl + N 顯示您使用的下一個命令。您可以多次點擊這些控件以前進到曆史記錄中的特定命令。
ALT + R 如果在當前行上編輯從曆史記錄中拉出的命令,則可以使用此控件將其還原為原始命令。

調出命令

您可以使用以下組合鍵從曆史記錄中調用、運行或選擇不運行特定命令:

CTRL + R 通過指定搜索字符串從曆史記錄中調用命令。
CTRL + O 運行通過Ctrl + R調用的命令
CTRL + G 退出曆史記錄,而無需運行通過Ctrl + R調用的命令

例:

在此示例中,我按了CTRL + R,然後提供了搜索字符串“ ar”。曆史記錄顯示命令“ arch”。

History Command Example

通過按ctrl + O運行命令“ arch”時,它顯示了我係統的CPU體係結構:

arch command

history進階

bash曆史記錄的真正魅力在於使用各種命令並自定義history命令本身以充分利用曆史記錄功能:

從曆史記錄運行命令

  • 如前所述,history命令通過將數字與每個命令相關聯來顯示命令。通過使用以下命令,您可以根據其曆史記錄從曆史記錄中運行某個命令:
$ !#

例:

在這裏,我從曆史記錄中運行命令號95:

$ !95

Running Commands from History

輸出顯示“ lscpu”的結果,該結果在我的bash曆史記錄中列為命令編號95。此命令顯示我的CPU和操作係統規格。

  • 您可以使用以下命重新執行上一個命令:
$ !!

例:

在這裏,您可以看到我運行了“ arch”命令。通過運行上述命令,我可以使用重新執行’arch’命令來查看我的CPU體係結構,如下所示:

  • 為了從曆史記錄中搜索命令,然後運行它,請使用以下命令:
$ ![keyword]

例:

我將使用以下命令對最後一個帶有關鍵字“ dconf”的命令重新執行:

$ !dconf

您可以在下圖中顯示,它的確是我運行的最後一個dconf命令。

使用先前命令中的參數

Linux bash使您可以使用上一個命令中的參數來運行新命令。當您要避免重新輸入冗長或複雜的參數時,它特別有用。為此,可以使用以下命令:

使用上一個命令的最後一個參數

$ [Command] !$

變量!$中存儲了前一個命令的最後一個參數。

例:

在此示例中,我將創建一個長名稱的文件。

Nano [longnameOfaFile]

然後,通過避免再次按以下方式鍵入長名稱,我將其複製到另一個位置:

Cp !$ [destinationfolder]

Using the last argument from the previous command

您可以看到我可以使用變量!$複製文件而無需重新輸入文件名!

使用上一個命令的第一個參數

有時,隻有前一個命令的第一個參數對當前命令有幫助。

在這種情況下,可以使用以下命令:

$ [command] !^

例:

在以下示例中,我通過指定主機名和計數作為參數來運行ping命令。現在,我想在新命令中使用主機名(第一個參數)而不是2(最後一個參數)。為此,我將使用以下命令:

$ ping !^

Using the first argument from the previous command

使用上一個命令的所有參數

您還可以通過使用以下命令來使用上一命令中的所有參數:

$ !*

使用曆史命令中的一個參數

您還可以使用曆史記錄中的命令的某個參數。為此,請使用以下命令:

$ [command] ![keyword]:#

例:

$ echo !cp:2

該命令將采用以下參數:

命令:echo

關鍵字:cp  [搜索的曆史命令的關鍵詞,取最後一個匹配的命令]

#:2(命令的第二個參數)

以下輸出顯示了我運行的最後一個cp命令的第二個參數:

Using one argument from a history command

使用曆史命令中的所有參數

以下命令將存儲搜索到的history命令中的所有參數,並在當前命令中使用它們:

$ command ![keyword]:*

例:

在以下命令中,我將使用echo命令打印最後一個cp命令的所有參數,如下所示:

$ echo ![cp]:*

Using all arguments from a history command

修改和運行以前的命令

如果您鍵入了錯誤的命令,或者想通過更改其中的一些文本來對命令再次執行;以下是這樣做的方法:

$ ^[previoustext]^[newtext]

例:

我將命令“ grep”錯誤鍵入為“ gep”,現在我想通過更正文本來運行命令:

$ ^gep^grep

現在您可以看到我的更正命令將按如下所示正確運行:

Modifying and Running Previous Commands

清楚history記錄

為了清除bash的曆史記錄,請使用以下命令:

$ history -c

此命令將清除您的曆史記錄並從文件〜/.bash_history中刪除所有內容

在本教程中,我們了解到,雖然打印整個曆史記錄內容可能沒有用,但通過我們學到的命令優化輸出還是非常有用的。

參考資料

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/4268.html,未經允許,請勿轉載。