歷史命令

歷史命令

我經常在終端機中輸入一些命令(儘管我完全希望任何答案都可以在 bash 和大多數其他命令中工作),然後由於缺少sudo.

好的,按“向上”鍵,按住/敲擊“向左”鍵,鍵入sudo並按“Enter”鍵。

它很煩人。命令越長越是如此。

請注意,丟失sudo是最壞的情況;接近開頭而不是結尾的拼字錯誤同樣令人煩惱

我想要的是一種執行「向上和主頁」擊鍵的方法。實際上,也許這兩下就可以了 - 但我的 Macbook 鍵盤沒有 Home,所以我無法嘗試。

sudo還可以透過 CMD+Shift+S 神奇地自動插入並點擊“輸入”,從而獲得獎勵積分。


這可以做到嗎,還是我在做夢?

答案1

只需使用UPCTRL-A

兩者!sudo功能sudo !!都很簡單。有區別的是:

  • sudo !!sudo將執行從開頭的 歷史記錄中取得的最後一個命令。

  • !sudo將執行歷史記錄中以 . 開頭的最後一個命令sudo

  • 通常CTRL-A會將您帶到 Linux 終端機中的行的開頭和CTRL-E結尾。
    如果您願意,可以繼續使用您的策略。您只需找到系統的捷徑即可。您可以找到以下列表捷徑在圖形和文字環境中例如這裡

只有一個警告sudo !!並且!sudo功能非常快速且您無法直觀地控制以超級用戶身份運行的線路。這可能會導致有害有時。特別是如果您出現印刷錯誤。

讓我們舉一個戲劇性的例子:

cd $HOME/Directory_To_Delete  # You go to delete what is inside a directory
rm -rf . ; cd ..              # You do it and go up of one
 apt-get update               # Note the space in the beginning of the line  
sudo !!                       # Gone!! Now you realize you never really wanted 

為時已晚,您剛剛刪除了主目錄和所有子資料夾!

當您編寫以空格作為第一個字元的命令時,它可能不會在歷史記錄中完成。這取決於變數 $HISTCONTROL 的值。如果其值清單包括忽略空間(或者忽略兩者) 以空格字元開頭的行不會保存在歷史清單中。所以用 sudo !您將執行之前的最後一個命令。

您可以想像類似的情況!sudo,它將執行sudo歷史記錄中記錄的最後一個以空格開頭的命令,但如果您記得的最後一個命令以空格開頭......現在您知道您將使用另一個命令。

最後一點:你的錯誤越少越引人注目,越可能是不正當的,因為它可能在你沒有註意到的情況下就過去了……你將面臨被要求支付你不記得的賬單的所有利息的風險。


更新(Bash 很棒):
使用最新版本的 Bash,可以使用我建議放入~/.bashrc文件中的以下命令來修復此危險行為:

shopt -s histverify

man bash你可以讀到

如果歷史驗證shell 選項已啟用且閱讀線正在使用中,歷史替換不會立即傳遞到 shell 解析器。相反,擴展的行被重新加載到讀取行編輯緩衝區中以進行進一步修改。

因此您可以在需要時讀取並修改您將執行的命令。
因為它不是許多發行版中的預設設置當我們使用其他帳戶時,我們仍然需要記住它。

答案2

以下是許多 Mac 和 Linux 程式使用的一些常見鍵盤組合(但不確定大多數 Windows 應用程式都遵循哪些組合):

  • CTRL-A- 將遊標移至目前行的開頭
  • CTRL-E- 將遊標移到目前行的末尾
  • CTRL-Left- 將遊標向後移動一個字
  • CTRL-Right- 將遊標向前移動一個字

答案3

使用

sudo !!

!!被完整的先前命令取代。

答案4

@WChargin 關於 是正確的!sudo,所以我正在更改我的答案...

sudo !!正如許多人所說,這是正確的答案。

以防萬一,我在此處貼上以下有關該history命令以及該!命令如何運作的內容。我希望這有幫助。


歷史命令

History 指令可用來列出您鍵入的指令的 Bash 日誌:

此日誌稱為“歷史”。要訪問它,請輸入:

history n 

這只會列出最後 n 個指令。輸入“history”(不含選項)以查看整個歷史清單。

您也可以輸入!n執行命令號n。使用!!執行您輸入的最後一個命令。

!-n之前會執行該指令 n 次(換句話說!-1相當於!!)。

!string將執行以該“字串”開頭的最後一個命令並且 !?string?將執行包含單字“string”的最後一個命令。例如:

!cd將重新運行您上次輸入的以“cd”開頭的命令。

commandName !*將使用您在上一個命令中使用的任何參數來執行“commandName”。例如,如果您犯了拼字錯誤,這可能很有用。如果您輸入:

emasc /home/fred/mywork.java /tmp/testme.java 

嘗試對上述兩個檔案執行 emacs 顯然會失敗。所以你可以做的是輸入:

emacs !* 

這將使用您上次在命令列中輸入的參數執行 emacs。換句話說,這相當於輸入:

emacs /home/fred/mywork.java /tmp/testme.java

命令列歷史記錄

相關內容