在sudo下重新运行先前的命令


8

我希望能够运行命令,它失败,因为它没有适当的权限。然后,我可以编写“ please”来对我刚运行的命令进行sudo编程。

这是我要在终端中执行的操作:

$ run command
"you don't have access to do that"
$ please
"ran successfully"

我看到!!它将抓住先前的命令,所以我以为可以使用它,但无法使用它。

我的please.sh shell脚本看起来像这样,但是我无法使它们正常工作。它只是说“找不到命令!” 并打印出sudo用法。

#!/bin/zsh

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

没有脚本就可以使用吗?如果您只是运行sudo !!,它会按预期运行吗?我认为 !!可能只是bash别名,因此它可能无法在zsh中使用
克里斯·韦恩

3
AFAIK,历史记录扩展(!!及其他)仅在交互式shell中起作用,而在脚本中不起作用。
2012年

sudo !!在交互模式下几乎可以按预期工作。当我按Enter时,它将!!被以前的命令替换。然后我必须再次按Enter键才能运行它。
jb。

Answers:


6

您无法!!在外壳程序脚本中使用,因为您无法在子外壳程序中访问父外壳程序。尽管我建议使用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`

希望这可以帮助!

如果您不了解该脚本,则只需使用sudo运行BASH中输入的最后一个命令。


好。我正在使用zsh。zsh中有什么等效于.bash_history的东西?
jb。

现在,我看,是的,应该有一个可用的版本。我还没有测试过。
MiJyn 2012年

不要直接读取bash历史记录文件。使用fchistory内置。默认情况下,除非注销bash,否则$ HISTFILE不会更新。
史蒂文·K

24

添加到您的.zshrc:

alias please='sudo $(fc -ln -1)'

工作方便,似乎比上面接受的答案更好。
米切尔·柯里

2
出于好奇:fc代表fix命令。文档在这里
dshepherd's

谢谢!我知道这是AskUbuntu,但是我在OSX上使用了此命令将我的最后一个命令复制到系统剪贴板:alias lastcmd="fc -ln -1 | pbcopy"我相信这应该(?)在Ubuntu:上可以工作alias lastcmd="fc -ln -1 | xclip -selection clipboard
HellaMad
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.