以sudo权限重新运行先前的命令

我想能够运行一个命令,但由于缺乏适当的权限而失败。然后我可以输入“please”来使用sudo执行刚刚运行的命令。
这是我想在终端中做的事情:
$ run command
"you don't have access to do that"
$ please
"ran successfully"

我看到 !! 可以抓取上一个命令,所以我以为我可以用它,但是我无法让它工作。
我的 please.sh shell 脚本看起来像这样,但我无法让任何一个工作。它只是显示 "command not found !!" 并打印出 sudo 的使用方法。
#!/bin/zsh

#sudo !!
#sudo `!!`
sudo $(!!)

没有脚本可以工作吗?如果您只运行 sudo !!,它是否按预期运行?我认为!!可能只是一个bash别名,所以在zsh中可能无法正常工作。 - Chris Wayne
3据我所知,历史扩展(!!等)仅在交互式shell中有效,而不适用于脚本。 - Thor
在交互模式下,sudo !! 几乎按预期工作。当我按下回车键时,它会将 !! 替换为上一个命令。然后我需要再次按下回车键来运行它。 - jb.
2个回答

在你的.zshrc文件中添加以下内容:
alias please='sudo $(fc -ln -1)'

非常好用,似乎比上面接受的答案更易使用。 - Mitchell Currie
3对于好奇的人来说:fc代表修复命令。文档在这里 - dshepherd
谢谢!我知道这是AskUbuntu,但我在OSX上使用它将我的最后一个命令复制到系统剪贴板:alias lastcmd="fc -ln -1 | pbcopy" 我相信这应该(?)在Ubuntu上也能工作:alias lastcmd="fc -ln -1 | xclip -selection clipboard - HellaMad
请注意,如果您要重新运行的上一个命令包含别名,则可能需要在.zshenv中定义该别名,以便在子shell中可用。 - xdhmoore

在Shell脚本中不能使用!!,因为在子Shell中无法访问父Shell。虽然我建议使用sudo !!,但如果你真的想要创建一个BASH脚本,你需要使用.bash_history,像这样:
#!/bin/bash
sudo `cat $HOME/.bash_history | tail -n1`

这绝对不是一个完美的解决方案,但应该能解决问题。如果你使用的是ZSH,这个方法可能行不通,因为据我所知,ZSH不会输出到.bash_history文件中。更新:这里有一个应该适用于ZSH的版本。
#!/usr/bin/zsh
. $HOME/.zshrc
sudo `cat \`readlink -f $HISTFILE\` | tail -n1`

希望这可以帮到你!
如果你不理解这个脚本,它只是在BASH中以sudo运行输入的最后一个命令。

好的。虽然我正在使用zsh,但是在zsh中是否有与.bash_history相当的功能呢? - jb.
现在我看了一下,是的,有一个应该可以工作的版本。不过我还没有测试过。 - MiJyn
1不要直接读取bash历史文件。使用fchistory内置命令。默认情况下,$HISTFILE在退出bash之前不会更新。 - Steven K