再次以root用户身份运行同一命令


116

有时,当我运行命令时,我没有注意到我需要以超级用户身份运行它以具有足够的权限。

有没有办法以超级用户身份再次运行同一命令?

Answers:


195

最简单的方法是运行:

sudo !!

这将以超级用户身份运行最后一个命令。

来源


5
我发现这很有用,而且我以前从未见过(尽管这可能是常识)。我在网站上找不到,所以我想自己回答。
Trufa

30
顺便说一句,根据执行的方式,单独执行即可!!运行您之前的命令history。此外,执行!-1!-2等等将执行您的最后一个命令,第二个最后一个命令,依此类推。便利!
oaskamay

6
!<command>~/.bash_history<command>
顺便说一句

1
ctrl -r也非常有用。它将在您的历史记录中向后搜索与您键入的命令匹配的命令。这样您就可以在再次运行命令之前编辑命令
KayEss 2013年

4
!从那里复制的这种愚蠢的bash东西使tcsh我搞砸了很多次,比以往任何时候都有用。双引号不能避免对的解释!$ foo "!bar"-> !bar: event not found
卡兹(Kaz)

70

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​在此处输入图片说明

答案:sudo !!随后直接输入即可以提升的权限重复上一个命令。

编辑: 通过reddit找到的图像,它是Randall Munroe 原始 xkcd漫画的模仿。


3
请不要在评论中进行赞成或反对对话。如果您想讨论优缺点,请使用Meta。谢谢。
fossfreedom

17

您可以尝试使用向上箭头键滚动浏览您的旧命令,然后重写/更改它们并sudo在其前面添加。(箭头键上方的主页按钮会将位置设置为开头。)

我不喜欢这个sudo !!主意,因为有时您在两者之间添加了另一个命令,并且不再记得了。


1
幸运的是,当您这样做时sudo !!,shell将会展开,!!以便您可以看到它正在尝试运行的命令。因此,按Ctrl-C并找到正确的命令可能会很烦人,但至少不会让您无所适从。
Reid

4
@Reid它不会扩大,直到您按下回车键,如果你是那个窗口,您不必再次输入密码之内,它将不确认运行。+1以使用历史记录而不是盲目使用!!
Izkata

5
@Izkata:我想是真的。我使用的是zsh,所以我只需输入即可为我sudo !!<TAB>自动完成!!。Bash可以扩展历史记录M-^(对于我来说,是alt + shift + 6),但这不太流畅(不过,您可以重新绑定它)。也有shopt -s histverify,它使您在使用历史记录扩展并按Enter键时,它会为您提供另一条提示行,其中包含执行的扩展以让您查看/编辑它。
里德

1
我想的更多是我键入命令的情况,该命令返回了权限被拒绝的信息,我知道我想再次运行此命令,但是作为sudo,按下,返回,键入sudo的过程让我感觉非常多对我慢一点。这是我一直以来所做的方式,但感觉效率很低。
Trufa

@Reid:一无所获shopt -s histverify。大多数人会习惯于Enter两次击打。到那时,他们仍然来不及检查发生了什么。
Frank Kusters,

13

我将添加一个替代方法:键入sudo !!而灵活:

Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A   (place cursor at beginning of line)
"sudo "
Enter

它的击键次数完全相同(我将“ ctrl + A”算作一个键...),但是添加“向上箭头”后,您就可以使用历史记录中的任何命令来执行此操作。


1
ctrl + A来自emacs绑定,您也可以使用vi绑定(set -o vi)。然后您可以转义(进入命令模式),然后是“ I”(大写的“ i”,在行首插入)。
Gerhard Burger

1
@GerhardBurger:我知道,但是,很奇怪,我喜欢 vi(尤其是vim)进行多行文档编辑,但是我更喜欢shell中的emacs绑定(不必从shell中的命令切换到编辑模式) imo确实很有意义,即使是emacs的快捷方式,即使功能不那么强大,也足以应付日常使用)
Olivier Dulac

没错,我添加它只是为了完整性,对我来说也是一样,但是我发现使用'/'搜索非常方便;)
Gerhard Burger

@GerhardBurger:关于vi模式的“ /”,常规(emacs绑定)bash也非常方便地找到以前的命令,方法是先输入几个字母,然后按“ ctrl + r”直到找到为止
Olivier Dulac

7

有几种方法可以做到这一点

  • 只需再次输入命令,sudo然后在命令之前添加

  • 按下Up arrow以获取最后一个命令并放在其sudo前面。

  • 输入 sudo !!

!!最后膨胀输入的命令。您可以使用命令行历史记录与其他事情做类似的事情,请参见此处


7

这个问题本来可以概括为“ 运行相同的命令,但要进行一些修改 ”,因为Unix中一项出色的设计决策是,在shell中实现一次的内容可以被从shell调用的任何命令所利用。

换句话说,这一招并不适用刚刚sudo

  • 以超级用户(sudo !!)重复上一个命令
  • 重复上一个命令并将其计时(time !!
  • 在其他环境(env A=b B=z !!)中重复上一个命令
  • 重复上一个命令(!!

历史记录扩展(也称为历史记录替换)只是一个shell功能,可以使重复以前的命令更加容易(击键次数更少)。检查您的Shell手册页中的history expansion。它描述了您可以使用历史记录进行操作的更多技巧和捷径,例如:

您可以按编号参考以前的命令:

!55                 # repeat command number 55
!-1                 # repeat the previous command, alias for !!
!-2                 # repeat the command before the previous command

您可以在先前的命令中引用单个单词:

some-command !$     # run some-command on the last arg of previous command

您还可以在重复之前进行搜索:

!?awk               # repeat the last command including the string 'awk'

您可以搜索历史记录,并用其他内容代替:

!?awk?:s/str1/str2/  # repeat previous command matching 'awk' replacing str1 by str2

还有更多功能,因为您可以将命令选择,arg选择,搜索和替换独立组合在一起。

您的shell手册页(在本例中为man bash)是您的朋友。


1
辉煌!那个应该是公认的答案。
伊莱兰·马尔卡

5

我使用zsh而不是bash并将其放在我的~/.zshrc,因此在命令行开头按Alt+ S插入sudo

insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo

不幸的是,我无法找到在bash中执行相同操作的方法。


3
您可以使用GNU的Readline容易做相同的击:添加到你的~/.inputrc "\es":"\C-asudo ",你会移动到长行的开始须藤将在按下该行的开始插入alt-s。重新启动终端或重新阅读~/.inputrc以使其正常工作。


1
su -c "!!"

如果您没有使用sudo成为root用户的权限,或者sudo程序未安装在系统上。


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.