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

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

有没有办法再次运行相同的命令,但作为超级用户?

最简单的方法是运行:

sudo !! 

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

来源 。

在此处输入图像描述

答案:你进入sudo !! 之后直接用升级的权限重复上一个命令。

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

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

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

我只想添加一个替代方案:只需键入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”视为一个…),但添加“向上箭头”,您可以在历史记录中的任何一个命令上执行此操作。

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

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

  • 向上箭头以获取最后一个命令并将sudo放在它前面。

  • 输入sudo !!

!! 扩展到最后输入的命令。 您可以使用命令行历史记录执行与此类似的操作

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

换句话说,这个技巧不仅仅适用于sudo

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

历史扩展(也称为历史替换)只是一个shellfunction,可以更轻松地重复以前的命令(使用较少的击键次数)。 检查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 )是你的朋友。

我使用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中做同样事情的方法。

 su -c "!!" 

如果你没有权限root用sudo或sudo程序没有安装在系统上。

我更喜欢它的方式:

  • 箭头键
  • “sudo”
  • 输入

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

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