用“ sudo”重复上一个命令


70

我经常忘记使用来运行命令sudo。我正在寻找一种使bash函数(或别名)与重复最后一个命令的方法sudo。就像是:

S() {
    sudo $(history 1)
}

有任何想法吗?



2
如果你不漫骂内容的过敏有一个叫包thefuckgithub.com/nvbn/thefuck。它试图找出上一个命令无法工作的任何原因并使它工作(例如,使用sudo运行)。正义类型fuck
slebetman

Answers:



25

不够?

sudo !!

如果您想S简单地说:

alias S=sudo

并使用它

S !!

!!均值last command


4
真好 我的用途是立即将精心制作的命令行转换为脚本: echo !! > script.sh
FractalSpace

24
我将其别名为“ please”。它对妈妈有效,对我的终端有效。
Stephan Muller 2014年

或者alias S='sudo $(history -p !!)'只是键入S
Aaron Franke

20

使用alias redo='sudo $(history -p !!)'。这是我发现的唯一可用于别名的东西。其他答案由于某些原因在别名中不起作用,即使我直接运行了它们,它们还是亲自尝试了。



5

添加和扩展aaron franke的响应(是正确的,但缺少原因),这样redo在配置别名之后简单地输入就可以了alias redo='sudo $(history -p !!);

这是我发现唯一可以使用别名的东西

有一些事情需要进行解释。

alias redo='sudo !!'

sudo尽管它确实解决了,但却无法执行该部分,因此无法正常工作!!

为了sudo !!正确解析,shell解析指令必须与一起执行和连接sudo。因此,我们做到了;

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

通过将别名的右边指定为$(history -p !!),这就是对shell的说明。

  1. redo 是别名,请评估右侧 =
  2. sudo 保持原样并将其连接到...
  3. $()是一个shell指令,用于在当前执行过程中执行内容(与sub-shell相对${},后者产生一个不同的过程以在其中执行)
  4. 解决 history -p !!
  5. !!被扩展到history -p <lastCommandHere>作为步骤4的结果。
  6. -p部分说history仅打印结果,而不执行
  7. sudo,执行剩余的(现在打印输出的同一命令行上),以高特权,假定密码被正确输入

这最终意味着该命令history -p !!有效地写出了解决方案,而不是在sudo。之后执行。

注意:这'是重要的。如果您使用",则!!两次对插值进行插值,并且要实现我们的目的,我们需要非常仔细地控制分辨率步骤;bash中的单/双引号

聚苯乙烯

如果您使用zsh+ oh-my-zsh,那么可以使用sudo别名设置_

_ !!

它将重新运行最后一个命令sudo。但是,如果您在中配置别名~/.zshrc,则alias redo='sudo $(history -p !!)由于解析步骤不同,因此zsh配置中的别名将无法正常工作。

就是说,当从zsh执行别名时,您可以放别名~/.bashrc而不是,~/.zshrc并获得相同的结果redo(假设您正在从bash中对zsh进行脱壳,尽管公认这有点麻烦-尽管是功能性的)。


1
的小费zsh值得入场的价格:)
Seamus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.