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