用“sudo”重复上一个命令

时间:2013-06-21 23:15:04

标签: bash

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

S() {
    sudo $(history 1)
}

有什么想法吗?

5 个答案:

答案 0 :(得分:108)

你可以写:

sudo !!

(见§9.3 "History Expansion" in the Bash Reference Manual。)

答案 1 :(得分:23)

还不够吗?

sudo !!

如果您希望简单地放置S

alias S=sudo

并使用它

S !!

!!表示last command

答案 2 :(得分:15)

使用alias redo='sudo $(history -p !!)'。这是我唯一的事情 发现可以使用别名。由于某些原因,其他答案在别名中不起作用,自己尝试过,即使它们在直接运行时也能正常工作。

答案 3 :(得分:14)

!!可用于引用最后一个命令。所以:

sudo !!

答案 4 :(得分:2)

根据aaron franke的响应进行添加和扩展(这是正确的,但缺少为什么),因此在配置别名redo之后只需键入alias redo='sudo $(history -p !!) ;

  

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

有一些事情需要解释。

alias redo='sudo !!'

无效,因为它确实解决了sudo,但它没有执行!!部分。

要使sudo !!正确解析,必须执行外壳解析指令并将其与sudo并置。我们这样做;

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

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

  1. redo是别名,请评估=
  2. 的右侧
  3. sudo保持原样,并连接到...
  4. $()是一个shell指令,用于在当前执行过程中执行内容(与子shell ${}相对,后者将在其中执行另一个过程)
  5. 解决history -p !!
  6. 第4步将!!扩展到history -p <lastCommandHere>
  7. -p部分告诉history仅打印结果,不执行
  8. 假设已正确输入密码,sudo将以提升的特权执行其余的(现在已打印在同一命令行上)

这最终意味着命令history -p !!有效地写出了分辨率,而不是在sudo之后执行。

注意'很重要。如果您使用",则!!会被插值两次,并且要实现我们的目的,我们需要非常小心地控制分辨率的步骤; single/double quotes in bash

PS

如果您使用的是zsh + oh-my-zsh,则会为sudo设置一个_别名,以便您可以这样做;

_ !!

这将以sudo重新运行最后一个命令。但是,如果要在~/.zshrc中配置别名,则alias redo='sudo $(history -p !!)将无法从zsh配置中正常使用,因为解析步骤不同。

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