用"sudo"重复上一个命令

Nem*_*emo 58 bash

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

S() {
    sudo $(history 1)
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

jm6*_*666 23

不够?

sudo !!
Run Code Online (Sandbox Code Playgroud)

如果你想S简单地把:

alias S=sudo
Run Code Online (Sandbox Code Playgroud)

并使用它

S !!
Run Code Online (Sandbox Code Playgroud)

!!平均last command

  • 我把它别名为"请".它适用于妈妈,它适用于我的终端. (20认同)
  • 尼斯.我的用途是立即将精心设计的命令行转换为脚本:`echo !! > script.sh` (3认同)

Aar*_*nke 17

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


Kot*_*lar 15

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

sudo !!
Run Code Online (Sandbox Code Playgroud)


Dis*_*nky 8

添加和扩展aaron franke的响应(这是正确的但缺乏原因),以便redo在配置别名后只需键入即可alias redo='sudo $(history -p !!)

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

有一些事情发生在那个授权解释上。

alias redo='sudo !!'
Run Code Online (Sandbox Code Playgroud)

不起作用,因为它不执行该sudo部分,尽管它确实解决了!!.

sudo !!正确解析 ,shell 解析指令必须执行并与sudo. 我们这样做;

alias redo='sudo $(history -p !!)'
Run Code Online (Sandbox Code Playgroud)

通过将别名的右侧指定为$(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设置别名_

_ !!
Run Code Online (Sandbox Code Playgroud)

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

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

  • `zsh` 的技巧值得入场费:) (2认同)