是否可以以超级用户身份再次运行同一命令? br />
#1 楼
最简单的方法是运行:sudo !!
这将以超级用户身份运行最后一个命令。
源代码。
#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 !!
–里德
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 !!”更容易,这取决于您。
评论
我发现这很有用,而且我之前从未见过(尽管这可能是常识)。我在网站上找不到,所以我想自己回答。
– Trufa
13年5月27日在20:32
顺便说一句,执行!根据历史记录保存,它会自行运行您先前的命令。此外,执行!-1,!-2等将执行您的最后一个命令,第二个最后一个命令,依此类推。便利!
–oaskamay
13年5月27日在20:41
另外,!
– 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