在 shell 历史记录中查找旧命令

sav*_*123 14 command-line bash history bash-history

如何找到我在终端中运行的旧命令?

我使用了一个 appengine 命令,并希望在我的本地命令历史记录中找到它,而无需再次在线研究它。

M. *_*rra 23

历史就是你要找的。

运行history以获取最近 1000 个命令的列表,或运行:

history | grep command_to_search
Run Code Online (Sandbox Code Playgroud)

在历史生成列表中搜索某种模式,例如:

history | grep apt
Run Code Online (Sandbox Code Playgroud)

要搜索任何apt相关命令,请注意grep不会将您的模式锚定到字符串的任一端,因此在大多数情况下不需要通配符。


history 列表是从存储在~/.bash_history(默认情况下存储最后 2000 个)中的最后 1000 个命令(默认情况下)生成的,并且只有在您干净地退出 Bash 会话时才会更新此类文件。这意味着,在您关闭终端之前,当前会话中的所有命令都不会在该文件中。如果您终止 shell 进程,它们也不会被写入。

因此,也可以~/.bash_history通过以下任一方式在 中找到命令历史记录(2000 条最后一条命令):

  • less ~/.bash_history 或者,例如 gedit ~/.bash_history
  • 打开 Nautilus,Ctrl+ h,然后搜索.bash_history文件。

history~/.bash_history行为可以被改变,加入或修改的选项~/.bashrc,这些是几个例子:

  • 追加export HISTCONTROL=ignoreboth:erasedups或修改现有HISTCONTROL行,以删除重复的命令,即如果在echo Hello之后立即运行,则在echo Hello中只会出现一个bash_history

  • 修改HISTSIZE=1000以扩展或减少显示的命令数量history

  • 修改HISTFILESIZE=2000以扩展或减少存储在bash_history. 设置HISTFILESIZE=-1为无限。

  • 附加HISTFILE=/path/to/file以将历史记录保存在其他地方。


来源和进一步阅读:

Bash 手册页

归功于 Byte Commander 的评论

  • `grep apt*` 不是你想的那样。首先,`apt*` 将被 Bash 的文件名 globbing 处理,所以如果你当前目录中有任何以“apt”开头的文件,glob 将被它们替换并且 `grep` 只会搜索那些完整的文件名. 为了防止通配,将模式用双引号或更好的单引号括起来:`grep 'apt*'`。 (3认同)
  • 但这仍然不是您想要的,因为`grep` 将模式视为正则表达式,而在正则表达式中,`*` 表示“任何时候都匹配前一个字符,包括零”——因此模式将匹配“ap” , "apt", "aptt", "apttt" 等等。你可以写`grep 'apt.*'`,因为正则表达式中的`.`匹配任何字符,但这是多余的,因为`grep`不锚您的模式到字符串的任一端,所以只需写下 `grep 'apt'` 就可以了。 (2认同)
  • 另请注意,`~/.bash_history` 仅在您干净地退出 Bash 会话时才会更新。这意味着,在您关闭终端之前,当前会话中的所有命令都不会在该文件中。如果您终止 shell 进程,它们也不会被写入。 (2认同)

Byt*_*der 13

有很多方法可以找到最近执行的命令。

  • 最简单的方法是按一下?键并逐行循环浏览您的命令历史记录,直到找到您要查找的内容。

  • 也可以按Ctrl+R键进入所谓的(reverse-i-search)模式。

    这是一个搜索提示,将自动完成您开始键入的内容,并使用最近运行的包含此字符串的命令。当它显示您要查找的内容时,按Enter运行它,或Esc退出搜索提示,同时将命令保留在提示上,以便您可以对其进行编辑。要放弃结果并退出搜索,请点击Ctrl+ C

  • 您可以使用history内置的Bash 来显示历史记录中记录的命令的完整列表。

    您可以使用例如grep、 like过滤该列表以查找与特定模式匹配的行history | grep 'appengine'

    history可以通过键入 找到有关 Bash 内置命令的更多信息help history

  • 使用 bang-expansion 直接运行最近执行的包含字符串的命令。这将用历史记录中的匹配行替换您键入的行并立即运行,无需确认,所以要小心。

    只需键入!string,它就会用最新的以“string”开头的命令行替换它。

    如果要运行最后一个以“string”结尾的命令,请输入!?string

    或者,如果您希望最后一个命令行在任何地方包含“字符串”,请键入!?string?.

    通过键入可以找到有关历史爆炸扩展的更多信息man history