在 bash 中获取历史记录中的命令但不执行

在 bash 中获取历史记录中的命令但不执行

要使用历史命令,你可以像这样写$!100。但有时我会对命令做一些小改动。

有没有办法从历史记录中获取命令而不执行它。

现在我使用鼠标从历史记录中复制和粘贴。我想知道如何仅使用键盘来完成此操作。

答案1

跑步

shopt -s histverify

使用它,你将获得历史命令的扩展,并可以在执行之前对其进行编辑。从手册

如果histverify启用了 shell 选项,并且正在使用 Readline,则历史替换不会立即传递给 shell 解析器。相反,扩展的行会重新加载到 Readline 编辑缓冲区中以供进一步修改。

你可以将此选项放入 Bash 的配置文件中(例如~/.bash_profile~/.bashrc取决于你使用)以自动启用它。

答案2

在 Bash 中,开始输入命令的前几个字母,然后按Ctrl+R开始历史记录搜索。您可以按Ctrl+R继续在 Bash 历史记录中向后搜索。找到所需的命令后,使用箭头键选择/浏览命令以根据需要进行编辑和执行。

您还可以使用空的命令缓冲区按Ctrl+R并从那里开始搜索。

答案3

除了已经提到的通过 ctrl+r 进行历史记录搜索之外,您还可以使用您已经熟悉的历史记录条目编号方法:

!<history entry number>

在其他命令中间,例如

echo !100

甚至引用先前命令的参数。例如,假设在我的历史记录中,条目 100 是:

ping google.com

我可以通过从历史记录条目中提取第一个参数来在 Google 上进行主机查找,如下所示:

host !100:1

这对于对上一个命令的特殊引用有效

!!

以及。当然,对于编号条目,您必须通过键入 history 并查看或通过管道传输到 grep 来了解它们的条目编号。如果您想通过匹配文本来从历史记录中提取内容,您可以在 ! 语句中使用上一个命令中的文本。例如,利用我在历史记录中有 ping google.com 语句的事实,我可以像这样引用它:

host !ping:1

使用文本搜索方法时要记住的是,它会向后搜索并提取第一个匹配项。

答案4

有没有办法从历史记录中获取命令而不执行它?

也许我没有抓住问题的重点,因为我怀疑我不是唯一知道 的人:p。它代表“print”。如果您输入!100:p,shell 将打印(即显示)命令 #100 而不执行它。

如果你不了解:历史上的运算符,你应该学习一下。  正如“数字例证”指出的那样, 检索:nn 命令的第 1 个单词。您还可以使用来获取范围;并且有有趣的默认值。例如,(离开:n-m:-n空白)会返回除最后一个单词之外的所有单词。  :$返回最后一个单词。  :h例如,如果输入的是“head”,那么

ls -ld /asdfg/qwerty/foo/bar

然后

!:- !$:h

变成

ls –ld /asdfg/qwerty/foo

哦,是!$的缩写!:$。  :s是替代,如。这与以下情况相同,但不包括以下内容::s/old/new/^old^new^

  1. :s可以用于任何命令(如!100:s/...);  ^^仅适用于最近的命令。
  2. :s可以用于单个单词或单词范围。例如,

    !:- !$:s/d/D/

    获取

    ls -ld /asDfg/qwerty/foo/bar

    (而不是ls -lD ...)。

  3. :s可以全局应用。语法不直观,但是,where替换第一次出现的情况,替换每次出现的情况。:s/old/new/:gs/old/new/

此外,一旦您从历史记录中获取了一条命令而不执行它(例如,使用!100:p),可能经过修改(如上所示),它将成为历史记录列表中最新的命令。现在您可以按下↑ (cursor up)并编辑它。

相关内容