我经常忘记使用来运行命令sudo
。我正在寻找一种使bash函数(或别名)与重复最后一个命令的方法sudo
。就像是:
S() {
sudo $(history 1)
}
有任何想法吗?
我经常忘记使用来运行命令sudo
。我正在寻找一种使bash函数(或别名)与重复最后一个命令的方法sudo
。就像是:
S() {
sudo $(history 1)
}
有任何想法吗?
Answers:
不够?
sudo !!
如果您想S
简单地说:
alias S=sudo
并使用它
S !!
该!!
均值last command
echo !! > script.sh
alias S='sudo $(history -p !!)'
只是键入S
使用alias redo='sudo $(history -p !!)'
。这是我发现的唯一可用于别名的东西。其他答案由于某些原因在别名中不起作用,即使我直接运行了它们,它们还是亲自尝试了。
添加和扩展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>
作为步骤4的结果。-p
部分说history
仅打印结果,而不执行sudo
,执行剩余的(现在打印输出的同一命令行上),以高特权,假定密码被正确输入这最终意味着该命令history -p !!
有效地写出了解决方案,而不是在sudo
。之后执行。
注意:这'
是重要的。如果您使用"
,则!!
两次对插值进行插值,并且要实现我们的目的,我们需要非常仔细地控制分辨率步骤;bash中的单/双引号
聚苯乙烯
如果您使用zsh
+ oh-my-zsh
,那么可以使用sudo
别名设置_
;
_ !!
它将重新运行最后一个命令sudo
。但是,如果您在中配置别名~/.zshrc
,则alias redo='sudo $(history -p !!)
由于解析步骤不同,因此zsh配置中的别名将无法正常工作。
就是说,当从zsh执行别名时,您可以放别名~/.bashrc
而不是,~/.zshrc
并获得相同的结果redo
(假设您正在从bash中对zsh进行脱壳,尽管公认这有点麻烦-尽管是功能性的)。
zsh
值得入场的价格:)