我經常在終端機中輸入一些命令(儘管我完全希望任何答案都可以在 bash 和大多數其他命令中工作),然後由於缺少sudo
.
好的,按“向上”鍵,按住/敲擊“向左”鍵,鍵入sudo
並按“Enter”鍵。
它很煩人。命令越長越是如此。
請注意,丟失sudo
是最壞的情況;接近開頭而不是結尾的拼字錯誤同樣令人煩惱。
我想要的是一種執行「向上和主頁」擊鍵的方法。實際上,也許這兩下就可以了 - 但我的 Macbook 鍵盤沒有 Home,所以我無法嘗試。
sudo
還可以透過 CMD+Shift+S 神奇地自動插入並點擊“輸入”,從而獲得獎勵積分。
這可以做到嗎,還是我在做夢?
答案1
只需使用UP和CTRL-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