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

是否可以以超级用户身份再次运行同一命令? br />

#1 楼

最简单的方法是运行:

sudo !!


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

源代码。

评论


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

– Trufa
13年5月27日在20:32

顺便说一句,执行!根据历史记录保存,它会自行运行您先前的命令。此外,执行!-1,!-2等将执行您的最后一个命令,第二个最后一个命令,依此类推。便利!

–oaskamay
13年5月27日在20:41

另外,!将执行〜/ .bash_history中以开头的最后一个事件。

– RaduRădeanu
13年5月27日在20:54

ctrl -r也非常有用。它将在您的历史记录中向后搜索与您键入的命令匹配的命令。这将允许您在再次运行命令之前编辑命令

–KayEss
13年5月28日下午3:37

这个笨!从tcsh复制的bash东西使我搞砸了很多次,比以往任何时候都有用。双引号不能避免对!的解释。 $ foo“!bar”->!bar:找不到事件。

–卡兹
13年5月28日在7:26

#2 楼

431 431

答案:您随后直接输入sudo !!以重复上一个命令升级的特权。

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

评论


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

–fossfreedom♦
13年5月28日在17:42

#3 楼

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

我不喜欢sudo !!的想法,因为有时您在两者之间添加了另一个命令,不再记得了。

评论


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

–里德
13年5月27日在21:58

@Reid直到您按下Enter键后,它才会展开,并且如果您位于不必再次输入密码的窗口内,它将在没有确认的情况下运行。 +1以使用历史记录,而不是盲目使用!!

–伊兹卡塔
13年5月28日在1:33



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

–里德
13年5月28日在1:46



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

– Trufa
13年5月28日在9:03

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

–弗兰克·库斯特斯(Frank Kusters)
13年5月30日在9:29



#4 楼

我将添加一个替代方法:只需键入sudo !!,然后更灵活:一个...),但是添加“向上箭头”就可以使用历史记录中的任何命令来执行。

评论


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

– Gerhard Burger
13年5月30日在10:31



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

–奥利维尔·杜拉克(Olivier Dulac)
13年5月30日在10:54

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

– Gerhard Burger
13年5月30日在11:01

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

–奥利维尔·杜拉克(Olivier Dulac)
13年6月13日在8:27

为什么不只使用“家庭”?那么实际上这只是一个按键。

–leviathanbadger
19-10-22在16:52

#5 楼

这个问题本来可以概括为“运行相同的命令,但要进行一些修改”,因为Unix中的一项出色的设计决策是,一旦在shell中实现了什么,就可以被从shell调用的任何命令所利用。 />
换句话说,此技巧不仅仅适用于sudo


以超级用户(sudo !!)的身份重复上一个命令
重复上一个命令并计时(time !!
在不同的环境(env A=b B=z !!)中重复上一条命令
重复上一条命令(!!

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

您可以按编号引用以前的命令: >您可以在以前的命令中引用单个单词: />您可以搜索历史记录并用其他内容替换:

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


还有更多,因为您可以独立地组合命令选择,arg选择,搜索和替换。

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

评论


辉煌!那个应该是公认的答案。

–伊莱兰·马尔卡(Eliran Malka)
13年6月14日在11:44

#6 楼

有几种方法可以执行此操作


再次输入命令,只需在命令前添加sudo
按向上箭头以获取最后一个命令并将sudo放在命令前面。
输入sudo !!

!!扩展到最后输入的命令。您可以使用命令行历史记录与其他事情进行类似的操作,请参见此处

#7 楼

我使用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中执行相同操作的方法。

评论


您可以使用GNU Readline在Bash中轻松地执行相同的操作:添加到〜/ .inputrc“ \ es”:“ \ C-asudo”,您将移至长行的开头,并将sudo插入按下alt-s时的行。重新启动终端或重新读取〜/ .inputrc以使其正常工作。

–user76204
13年5月28日在17:25



#8 楼

如果要使用别名,则出于某种原因必须使用alias redo='sudo $(history -p !!)'

#9 楼

su -c "!!"


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

#10 楼

我喜欢的方式:


向上键
首页
“ sudo”
输入

但是可能是做“ sudo !!”更容易,这取决于您。