Bash

如何撤消命令歷史記錄中的更改?

  • November 23, 2020

在 UNIX 系統中,您可以按頂部和底部箭頭來瀏覽前面的命令。這非常方便。

有時,我會找到一個我想再次使用的命令,但有一些變化。如果我做了這樣的改變,那麼我就沒有辦法取回原來的命令,除非我把它簽入history.

有什麼方法可以“撤消”通過鍵訪問的歷史記錄中對命令的更改?

我目前的解決方法是在命令前面加上 a #。這樣,目前命令將作為註釋執行,因此沒有任何反應。然後,我可以使用鍵再次瀏覽命令。問題是我使用的命令可能在列表中很遠,所以再上升兩百次有點。Control + R 也不是解決方案,因為我可能不記得我在尋找什麼。

例子

我輸入了以下“50 個命令前”:

ls -l /etc/httpd/conf/

現在我走到那條線並將其更改為

ls -l /etc/init.d/

但沒有按輸入。現在,我想ls -l /etc/httpd/conf/再來一次。

我的環境

$ echo $SHELL
/bin/bash
$ echo $TERM
xterm

只要您已編輯歷史條目但尚未按下Enter,要返回原始條目,請反复按Ctrl+ _-undo命令 - 直到它不再進行任何更改。你又回到了原來的條目。

對行進行多次更改後,恢復為原始命令:

revert-line (M-r) 
   Undo all changes made to this line. This is like 
executing the undo command enough times to get back to the beginning.

M是元鍵,即alt</kbd+r for me.


無償但有用的資訊

當您執行了 OP之前執行過的命令時(它發生了),沒有什麼可以“撤消”,因為這些命令由GNU Readline庫處理和記住,並且在 shell 退出之前不會被寫入。$HISTFILE我提到這一點的原因是因為你不能像人們期望grep的那樣,退出 shell 可能並不理想。$HISTFILE

因此,這裡有幾個選項可以避免您向後滾動所有以前的 readline 命令。

如果您記得某些命令,請按ctrl+r並鍵入您記得的內容以搜尋包含該字元串的先前命令。再次按ctrl+r將顯示下一個最新的,向後搜尋。

例如,鍵入ls -lthen ctrl+r的次數與查找您查找的上一個命令所需的次數一樣多。如果滾動過去,ctrl+s 將從目前位置向前搜尋。

fcbash 內置命令有助於在之前的 readline 命令旁邊列出索引號。

fc -l -100將列出 readline 中的前 100 個命令。

此外,如果 OP 知道他正在尋找以前的ls -l命令,他可以將輸出通過管道傳輸到grepfc -l -100 | grep 'ls -l'

這應該輸出ls -l前面帶有索引號的先前命令的列表。輸出如下所示:

2065 ls -l

現在您可以使用索引號!n在哪裡的事件指示符。n在此範例中,執行!2065將擴展為ls -l.


儘管事後沒有幫助,但任何希望在修改以前的命令時保留最近的命令歷史記錄的人都應該看到HISTORY EXPANSION. man bash以下是一些在不覆蓋歷史記錄的情況下修改舊命令的替代方法。

Event Designators部分展示瞭如何從最近使用的命令中輕鬆編輯字元串。

^string1^string2^
             Quick  substitution.  Repeat the previous command, replacing string1 with string2.  Equivalent to
             ``!!:s/string1/string2/'' (see Modifiers below).

例子:

$ echo foo
foo 
$ ^foo^bar
echo bar
bar

最近的命令現在將顯示:

echo foo
echo bar

上面的範例還解釋瞭如何使用sed來替換事件指示符中的字元串。

!-n    Refer to the current command minus n.

因此,如果歷史記錄中有 3 個命令是,echo foo那麼您將使用:

!-3:s/foo/bar

請注意,在這種情況下,事件指示符將作為執行的命令出現在您的歷史記錄中echo bar。它不會以!-3:s/foo/bar.

只是把它扔在那裡,因為它似乎密切相關,即使它更像是“不要做”而不是 OP 正在尋找的“撤消”解決方案。

引用自:https://unix.stackexchange.com/questions/199598