題 如何搜索bash歷史記錄並重新運行命令?


我可以用bash搜索歷史記錄並運行結果嗎?


277
2017-07-17 19:23


起源




答案:


類型 按Ctrl  [R 在命令行並開始鍵入上一個命令。一旦結果出現持續擊中 按Ctrl  [R 看其他比賽。當您想要的命令出現時,只需按 輸入

請注意,雖然 按Ctrl  [R 是默認值,如果你想要命令(reverse-search-history)受約束 按Ctrl  Ť 您可以使用以下配置:

bind'“\ C-t”:reverse-search-history'

還有許多其他readline可綁定命令可供您使用。看看吧 bash 手冊頁

Bash有許多工具可以搜索和訪問交互式命令歷史記錄。其中最基本的是 history 內置。打字只是:

$歷史

將打印一個命令列表以及一個數字索引,如:

$歷史
1清楚
2 ls -al
3 vim~ / somefile.txt
4歷史
$

然後,您可以使用數字索引執行任何這些命令,方法是使用單個索引作為索引 !作為 米奇 指出:

$!1

將執行 clear 命令。內置的歷史本身有很多功能,你可以在中看到更多 bash 和 history 手冊頁。

您還可以在使用時指定相對負偏移 ! 指示符,如果我們想要執行,請使用上面的歷史列表 vim 再次,我們可以這樣做:

$!-2

這基本上是告訴bash執行你在“兩個命令之前”運行的命令。要在歷史列表中運行上一個命令,我們可以使用 !! (這只是簡寫 !-1)。

! 指示符不限制您以數字方式指定要運行的命令。 hayalci 表明你可以指導 bash 基於它開頭的文本執行命令(使用 !)或命令本身內的文本(使用 !?)。再次,使用上面的示例歷史列表,如果我們想要執行 clear 再次,我們需要做的就是鍵入:

$!cl

並按 輸入。那怎麼樣? vim?這很簡單:

$!?一些

最重要的一點來自 hayalci的回應就是呼喚 shopt 內置:

$ shopt -s histverify

這將啟用歷史驗證,以便匹配的命令 !!!,和 !? 指示符不是盲目執行的,而是填寫在命令行上,這樣你就可以確保它們在執行它們之前不會做任何惡意。當您以root用戶身份執行命令時,這一點尤為重要。此選項可在您的設置中設置 .bashrc 啟動文件,以便在您登錄時設置它。

正如已經指出的那樣,所有這些信息都可以從中收集到 bash 手冊頁。對於!,!!和!?指示人員,看看科 9.3歷史擴展


399
2017-07-17 19:25



+1我已經使用Linux超過12年的所有系統。我不知道那是不存在的。希望我能+10 我怎麼會錯過它? - Aiden Bell
在我開始經常使用emacs之前,我沒有發現它。然後我有一天不小心把它打成了bash(以為我在emacs中)。 - Sean Bright
在許多系統上,按向上箭頭也是如此。 - mas
我的向上箭頭只是轉到上一個命令。但是,是的,它可以與任何你想要的東西綁定。 - Sean Bright
按下CTRL + R後,您可以多次使用CTRL + SHIFT + R跳回上一個命令 - Gal Bracha


作為替代 CRTL + R,您可以通過鍵入來搜索歷史記錄

!text

這將搜索歷史記錄以查找最新命令 開始 用'文字'。

但我建議你把它放在.bashrc中以防止執行錯誤的命令。

shopt -s histverify

這指示bash,之後 任何 歷史行動(如 !!:s/prev_text/after_text),它將結果行放在命令提示符下。然後,您可以查看或編輯該命令,然後按Enter鍵。


35
2017-07-17 20:40



使用!?文本重新執行包含(而不是以“text”開頭)的最新命令。 - mark4o
如果有人要鞏固'!','!!','!?','歷史| grep'和'ctrl-r'成為一個全面的答案,我會選擇它。 - Richard Hoskins


你也可以這樣做:

history | grep "stuff"

它會返回類似的東西

num stuff

然後你可以輸入

!num

28
2017-07-17 20:21





我更喜歡使用歷史搜索 - 後退而不是反向搜索歷史。前者允許您鍵入命令的幾個字符 然後 按搜索鍵,而不是先按下搜索鍵,然後鍵入搜索字符串。

默認情況下,在我的系統上,M-p和M-n綁定到類似的功能,但我更喜歡綁定箭頭鍵:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'

14
2018-02-02 20:32





優秀的寫作,肖恩!我把它放在評論中,但我有點害羞。 :-)

另一個相關且有用的技術是在更改單詞時運行先前命令的能力。假設您輸入了目錄名稱,或者想要更改文件名:

$ echo我的名字是鮑勃
我的名字是鮑勃
$ ^ bob ^ jordan
回應我的名字是約旦
我的名字是約旦

請注意,在運行命令之前,命令會被擴展,替換和輸出,因此如果運行了錯誤的命令,您可以看到bash認為它正在做什麼。


12
2017-09-10 14:23





我有一個非常好的別名,h。它實際上只是“history | grep”,但我用“grep -E -v”過濾掉之前的“h命令”條目

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

用過像

h aliases
2003  less .bash_aliases

12
2017-09-25 16:45



這也可以通過添加命令來完成 HISTIGNORE。 - tanenbring


由於使用Ctrl-r導航歷史記錄是IMO的麻煩,您可能需要考慮 HH

https://github.com/dvorka/hstr

這使得導航更加簡單,直接和高效 - 包括運行命令:

enter image description here


5
2017-12-18 16:37



如何使用它?哪個按鍵可以看到這張照片? - Nakilon
一旦你安裝了......你可以使用hh命令或將它綁定到任何鍵盤快捷鍵(通常是Ctrl-r),如文檔中所述。 - Martin Dvorak
它綁定到 ctrl + r 現在默認 - Alleo


在bash命令提示符下,鍵入control-R,然後鍵入所需命令的幾個字符,bash的readline工具將搜索該命令的命令歷史記錄。

開始搜索後,可以再次鍵入control-R以跳轉到下一個匹配的命令。


3
2017-09-04 04:55





如果您已將shell配置為使用 vi 鍵綁定(set -o vi 或者 set editing-mode vi 在 $HOME/.inputrc),然後你搜索 <Esc>/some-command<Return> 並擊中 n (下)或 Shift-n (上一個)循環執行命令行歷史記錄。


3
2017-11-22 15:21



這個是最接近vim用戶的。 - Gabor Marton


CTRL+[R 工作得很好,就像@ John1024建議的那樣,但是如果你最近的許多命令都很相似並且想要快速掃描它們,那就有點單調乏味了。另一種方法是使用 history

$ history | grep keyword

2
2017-09-04 05:11