簡體   English   中英

用“sudo”重復上一個命令

[英]Repeat last command with “sudo”

我經常忘記用sudo運行命令。 我正在尋找一種方法來使用sudo重復最后一個命令的bash函數(或別名)。 就像是:

S() {
    sudo $(history 1)
}

有任何想法嗎?

你可以寫:

sudo !!

(參見Bash參考手冊中的§9.3“歷史擴展” 。)

不夠?

sudo !!

如果你想要S簡單地把:

alias S=sudo

並使用它

S !!

!! 意思是last command

使用alias redo='sudo $(history -p !!)' 這是我發現的唯一可以使用別名的東西。 由於某種原因,其他答案在別名中不起作用,自己嘗試過,即使它們在直接運行它們時也能正常工作。

!! 可用於引用最后一個命令。 所以:

sudo !!

添加和擴展aaron franke的響應(這是正確但缺乏原因 ),只需在配置別名alias redo='sudo $(history -p !!)后輸入redo就可以了。

這是我發現的唯一可以使用別名的東西

有一些事情可以解釋。

alias redo='sudo !!'

不起作用,因為它不執行sudo部分,雖然它確實解決了!!

得到sudo !! 要正確解析,shell解析指令必須與sudo一起執行和連接。 所以我們這樣做;

alias redo='sudo $(history -p !!)'

通過將別名的右側指定為$(history -p !!) ,這對shell來說是什么意思;

  1. redo是別名,評估=的右側
  2. sudo仍然保持原樣並且連接到......
  3. $()是一個shell指令,用於執行當前執行過程中的內容(與子shell ${}相反,它產生一個不同的進程來執行)
  4. 解決history -p !!
  5. !! 作為步驟4的結果,擴展到history -p <lastCommandHere>
  6. -p部分說history只打印結果,而不是執行
  7. sudo使用提升的權限執行剩余的(現在在同一命令行上打印出來),假設密碼輸入正確

這最終意味着命令history -p !! 有效地寫出分辨率而不是在sudo之后執行。

注意'很重要。 如果你使用"!!插入兩次並實現我們的目的,我們需要非常小心地控制分辨率步驟; bash中的單/雙引號

PS

如果您使用zsh + oh-my-zsh ,有一個sudo別名設置為_ ,這樣你可以做的;

_ !!

哪個會以sudo重新運行最后一個命令。 但是,如果您在~/.zshrc配置別名,則alias redo='sudo $(history -p !!)將不會像zsh配置那樣工作,因為解析步驟不同。

也就是說,您可以將別名放入~/.bashrc而不是~/.zshrc ,並且在從zsh執行別名redo時具有相同的結果(假設您從bash中對zsh進行了子shell,盡管這無疑是一點點一個kludge - 雖然是功能性的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM