[英]Repeat last command with “sudo”
我經常忘記用sudo
運行命令。 我正在尋找一種方法來使用sudo
重復最后一個命令的bash函數(或別名)。 就像是:
S() {
sudo $(history 1)
}
有任何想法嗎?
不夠?
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來說是什么意思;
redo
是別名,評估=
的右側 sudo
仍然保持原樣並且連接到...... $()
是一個shell指令,用於執行當前執行過程中的內容(與子shell ${}
相反,它產生一個不同的進程來執行) history -p !!
!!
作為步驟4的結果,擴展到history -p <lastCommandHere>
。 -p
部分說history
只打印結果,而不是執行 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.