74

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

S() {
    sudo $(history 1)
}

有任何想法吗?

4

5 回答 5

141

你可以写:

sudo !!

(请参阅Bash 参考手册中的第 9.3 节“历史扩展”。)

于 2013-06-21T23:16:09.243 回答
25

不够?

sudo !!

如果你想要S简单地说:

alias S=sudo

并使用它

S !!

!!意思是last command

于 2013-06-21T23:17:47.200 回答
21

使用alias redo='sudo $(history -p !!)'. 这是我发现的唯一适用于别名的东西。由于某种原因,其他答案在别名中不起作用,我自己尝试过它们,即使它们在直接运行它们时确实有效。

于 2016-07-07T09:50:54.973 回答
15

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

sudo !!
于 2013-06-21T23:16:15.263 回答
10

添加和扩展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. 作为第 4 步的结果,它!!被扩展为。history -p <lastCommandHere>
  6. -p部分说history只打印结果,不执行
  7. ,sudo以提升的权限执行剩余的(现在打印在同一命令行上),假设密码输入正确

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

注意:这'很重要。如果你使用"!!则被插值两次,为了达到我们的目的,我们需要非常小心地控制分辨率步骤;bash中的单引号/双引号

附言

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

_ !!

这会将最后一个命令重新运行为sudo. 但是,如果您在 中配置别名~/.zshrcalias redo='sudo $(history -p !!)则不会像 zsh 配置那样工作,因为解决步骤不同。

也就是说,在从 zsh执行别名时,您可以将别名放入~/.bashrc而不是并具有相同的结果(假设您是从 bash 中对 zsh 进行子壳,尽管这无疑是一个有点杂乱无章的东西——尽管是一个功能性的)。~/.zshrcredo

于 2019-08-06T21:46:26.537 回答