再次运行相同的命令,但以 root 身份运行

Tru*_*ufa 132 command-line sudo

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

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

Tru*_*ufa 216

最简单的方法是运行:

sudo !!
Run Code Online (Sandbox Code Playgroud)

这将运行最后一个命令,但作为超级用户。

来源

  • 顺便说一句,执行 `!!` 会根据保存在 `history` 中的内容运行你之前的命令。此外,执行`!-1`、`!-2` 等会执行您的最后一个命令、倒数第二个命令,依此类推。便利! (33认同)
  • 另外,`!<command>` 将执行 `~/.bash_history` 中以 `<command>` 开头的最后一个事件 (8认同)
  • 我发现这非常有用,而且我以前从未遇到过(尽管它可能是常识)。我在网站上找不到它,所以我想我会自己回答。 (6认同)
  • 这个从 `tcsh` 复制过来的愚蠢的 `!` bash 东西把我搞砸的次数比它有用的次数还多。双引号不能防止对 `!` 的解释。`$ foo "!bar"` -> `!bar: event not found`。 (4认同)
  • ctrl-r 也很有用。它将在您的历史记录中向后搜索与您键入的内容相匹配的命令。这将允许您在再次运行之前编辑命令 (2认同)

wim*_*wim 79

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

??????????????????????????????????????????????????? 回答:sudo !!之后直接输入以使用升级的权限重复上一个命令。

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

  • 请不要在评论中进行支持或反对的对话。如果您想讨论优缺点,请使用 Meta。谢谢。 (3认同)

小智 17

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

我不喜欢这个sudo !!想法,因为有时你在中间添加了另一个命令并且不再记得了。

  • @Izkata:我想这是真的。我使用 zsh,所以我只需输入 `sudo !!<TAB>` 并自动完成 `!!`。Bash 可以使用`M-^`(对我来说,alt+shift+6)来扩展历史记录,但这不太流畅(不过你可以重新绑定)。还有`shopt -s histverify`,这使得当您使用历史扩展并按回车键时,它会为您提供另一个提示行并执行扩展以让您查看/编辑它。 (5认同)
  • @Reid它不会扩展,直到_after_你按下回车键,如果你在那个不需要再次输入密码的窗口中,它会在没有确认的情况下运行。+1 使用历史记录而不是盲目使用`!!` (4认同)

Oli*_*lac 14

我将添加一个替代方案:与打字一样简短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
Run Code Online (Sandbox Code Playgroud)

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


ari*_*ica 14

这个问题可以概括为“运行相同的命令但进行一些修改”,因为 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
Run Code Online (Sandbox Code Playgroud)

您可以参考之前命令中的单个单词:

some-command !$     # run some-command on the last arg of previous command
Run Code Online (Sandbox Code Playgroud)

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

!?awk               # repeat the last command including the string 'awk'
Run Code Online (Sandbox Code Playgroud)

您可以搜索历史记录并用其他内容替换某些内容:

!?awk?:s/str1/str2/  # repeat previous command matching 'awk' replacing str1 by str2
Run Code Online (Sandbox Code Playgroud)

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

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

  • 太棒了!那一个应该是公认的答案。 (3认同)

小智 7

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

  • 只需在命令sudo前再次输入命令

  • Up arrow获取最后一个命令并放在sudo它前面。

  • 进入 sudo !!

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


小智 6

我使用的zsh,而不是猛砸,并有这在我的~/.zshrc,所以按Alt+S刀片sudo在命令行的开头:

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

不幸的是,我无法找到在 bash 中做同样事情的方法。

  • 您可以使用 GNU Readline 在 Bash 中轻松完成相同的操作:添加到您的 `~/.inputrc` `"\es":"\C-asudo "`,您将移动到长行的开头 ** 和 ** sudo 将在按下 `alt-s` 后插入到行首。重新启动终端或重新读取`~/.inputrc` 使其工作。 (4认同)