历史命令

历史命令

经常在终端中(尽管我完全希望任何答案都能在 bash 和大多数其他系统中起作用),我输入一些命令,然后由于缺少而出现某种权限错误sudo

好的,按“向上”键,按住/按下“左”键,输入sudo并按“回车”键。

这很烦人。命令越长,就越烦人。

请注意,遗漏sudo是最糟糕的情况;开头附近的拼写错误比结尾附近的拼写错误同样令人讨厌

我想要的是一种执行“向上和向左”按键的方法。实际上,也许这两个按键就可以实现 - 但我的 Macbook 键盘没有 Home 键,所以我无法尝试。

sudo通过 CMD+Shift+S 等快捷方式自动插入并点击“回车”,可以获得加分。


这能做到吗,还是我只是在做梦?

答案1

只需使用UPCTRL-A

!sudo和都很sudo !!容易操作。但有区别:

  • sudo !!将从历史记录中获取的最后一条命令执行该命令sudo

  • !sudo将执行历史记录中以 开头的最后一条命令sudo

  • 通常CTRL-A会将您带到 Linux 终端中的行首和CTRL-E行末。
    如果您愿意,您可以继续使用您的策略。您只需找到系统的快捷方式。您可以找到快捷方式在图形和文本环境中例如这里

警告sudo !!而且!sudo功能非常快,您无法以超级用户身份直观地控制所运行的线路.这可能导致有害有时。特别是当你遇到印刷错误时。

让我们举一个戏剧性的例子:

cd $HOME/Directory_To_Delete  # You go to delete what is inside a directory
rm -rf . ; cd ..              # You do it and go up of one
 apt-get update               # Note the space in the beginning of the line  
sudo !!                       # Gone!! Now you realize you never really wanted 

太晚了,你刚刚删除了你的主目录和所有子文件夹!

当您编写以空格作为第一个字符的命令时,它可能不会在历史记录中结束。这取决于变量 $HISTCONTROL 的值。如果其值列表包括忽略空间(或者忽略两者) 以空格字符开头的行不会保存在历史列表中。因此使用 sudo !! 您将执行之前的最后一个命令。

您可以想象类似的情况!sudo,它将执行sudo历史记录中记录的以 开头的最后一个命令,但如果您记得的最后一个命令以空格开头……现在您知道您将使用另一个。

最后要注意:你的错误越不严重,它就越可能是狡猾的,因为它可能会在你没有注意到的情况下过去……而且你将面临被要求支付一张你不记得的账单的全部利息的风险。


更新(Bash 很棒):
使用最新版本的 Bash,可以使用以下命令修复这种危险行为,我建议将其放入~/.bashrc文件中:

shopt -s histverify

man bash可以阅读

如果历史验证shell 选项已启用,并且阅读行正在使用,历史替换不会立即传递给 shell 解析器。相反,扩展后的行会重新加载到 readline 编辑缓冲区中,以便进一步修改。

因此,您可以读取并在需要时修改要执行的命令。
由于它不是许多发行版中的默认设置当我们使用其他帐户时仍然必须记住它。

答案2

以下是许多 Mac 和 Linux 程序使用的几种常见键盘组合(但不确定大多数 Windows 应用程序遵循哪些组合):

  • CTRL-A- 将光标移到当前行的行首
  • CTRL-E- 将光标移到当前行的末尾
  • CTRL-Left- 将光标向后移动一个单词
  • CTRL-Right- 将光标向前移动一个单词

答案3

使用

sudo !!

!!被完整的前一个命令替换。

答案4

@WChargin 是正确的!sudo,所以我改变了我的答案......

sudo !!正如许多人所说,这是正确答案。

为了以防万一,我在这里粘贴了以下内容,关于该history命令以及该!命令的工作原理。希望这对您有所帮助。


历史命令

history 命令可用于列出您输入的命令的 Bash 日志:

此日志称为“历史记录”。要访问它,请输入:

history n 

这将仅列出最后 n 条命令。输入“history”(不带选项)可查看整个历史记录列表。

您还可以输入!n执行命令编号 n。使用!!执行您输入的最后一个命令。

!-n将执行该命令 n 次(换句话说!-1相当于!!)。

!string将执行以该“字符串”开头的最后一个命令,并且 !?string?将执行最后一个包含单词“string”的命令。例如:

!cd将重新运行您上次以“cd”开头输入的命令。

commandName !*将使用您在上一个命令中使用的任何参数执行“commandName”。例如,如果您犯了拼写错误,这可能会很有用。如果您输入:

emasc /home/fred/mywork.java /tmp/testme.java 

尝试对上述两个文件执行 emacs 显然会失败。因此,您可以输入:

emacs !* 

这将使用您上次在命令行中输入的参数执行 emacs。换句话说,这相当于输入:

emacs /home/fred/mywork.java /tmp/testme.java

~命令行历史记录

相关内容