我经常忘记运行命令sudo
.我正在寻找一种方法来制作一个bash函数(或别名)来重复最后一个命令sudo
.就像是:
S() {
sudo $(history 1)
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
jm6*_*666 23
不够?
sudo !!
Run Code Online (Sandbox Code Playgroud)
如果你想S
简单地把:
alias S=sudo
Run Code Online (Sandbox Code Playgroud)
并使用它
S !!
Run Code Online (Sandbox Code Playgroud)
的!!
平均last command
Aar*_*nke 17
使用alias redo='sudo $(history -p !!)'
.这是我发现的唯一可以使用别名的东西.由于某种原因,其他答案在别名中不起作用,自己尝试过,即使它们在直接运行它们时也能正常工作.
添加和扩展aaron franke的响应(这是正确的但缺乏原因),以便redo
在配置别名后只需键入即可alias redo='sudo $(history -p !!)
;
这是我发现的唯一可以使用别名的东西
有一些事情发生在那个授权解释上。
alias redo='sudo !!'
Run Code Online (Sandbox Code Playgroud)
不起作用,因为它不执行该sudo
部分,尽管它确实解决了!!
.
要sudo !!
正确解析 ,shell 解析指令必须执行并与sudo
. 我们这样做;
alias redo='sudo $(history -p !!)'
Run Code Online (Sandbox Code Playgroud)
通过将别名的右侧指定为$(history -p !!)
,这就是对 shell 说的;
redo
是别名,评估右侧 =
sudo
保持原样,它连接到......$()
是一个 shell 指令,用于执行当前执行进程中的内容(与 sub-shell 相对${}
,它产生一个不同的进程在其中执行)history -p !!
!!
被扩展到history -p <lastCommandHere>
作为步骤4的结果。-p
部分说要history
只打印结果,不执行sudo
,执行剩余的(现在打印输出的同一命令行上),以高特权,假定密码被正确输入这最终意味着该命令history -p !!
有效地写出分辨率而不是在sudo
.
注意:'
很重要。如果您使用"
,则会!!
被插值两次,为了达到我们的目的,我们需要非常小心地控制解析步骤;bash中的单引号/双引号
聚苯乙烯
如果您使用zsh
+ oh-my-zsh
,则可以sudo
设置别名_
;
_ !!
Run Code Online (Sandbox Code Playgroud)
这将重新运行最后一个命令作为sudo
. 但是,如果您在 中配置别名~/.zshrc
,alias redo='sudo $(history -p !!)
由于解析步骤不同,zsh 配置将无法正常工作。
也就是说,当从 zsh执行别名时,您可以将别名放入~/.bashrc
而不是~/.zshrc
并获得相同的结果redo
(假设您是从 bash 对 zsh 进行子壳,尽管这确实有点麻烦 - 尽管是功能性的)。