如何在 Linux 中使用 history 命令

使用强大的 history 命令,提高在命令提示符下的效率。
463 位读者喜欢此文。
Top 5 Linux pain points in 2017

Internet Archive Book Images。由 Opensource.com 修改。CC BY-SA 4.0

随着我在终端会话中花费的时间越来越多,我感觉我一直在发现新的命令,这些命令可以提高我日常任务的效率。 GNU history 命令确实改变了我的工作日。

GNU history 命令会保留从该终端会话运行的所有其他命令的列表,然后允许您重放或重用这些命令,而无需重新键入它们。 如果您是经验丰富的终端用户,您会了解 history 的强大功能,但对于我们这些初学者或新的系统管理员来说,history 可以立即提高生产力。

首先,history 命令实际上不是一个命令。 您可以通过在您的系统上查找该命令来亲自验证这一点

$ which history
which: no history in (/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/local/sbin)

您的计算机找不到 history 命令,因为它是一个内置的 shell 关键字。 由于它被写入您正在使用的 shell 中,因此 history 的行为方式可能会有所不同,具体取决于您使用的是 Bash、tcsh、Zsh、dash、fish、ksh 等。 本文基于 history 的 Bash 实现,因此某些功能可能在其他 shell 中不起作用。 但是,大多数基本功能都是相同的。

History 101

要查看 history 的实际效果,请在您的 Linux 安装上打开一个终端程序并键入

$ history

这是我得到的回复

1  clear
2  ls -al
3  sudo dnf update -y
4  history

history 命令显示自您启动会话以来输入的命令的列表。 history 的乐趣在于,您现在可以通过使用诸如以下命令来重放其中的任何一个

$ !3

提示符处的 !3 命令告诉 shell 重新运行 history 列表中的第 3 行命令。 我也可以通过输入以下内容来访问该命令

$ !sudo dnf

这会提示 history 搜索与您提供的模式匹配的最后一个命令(在本例中,该模式是 dnf)并运行它。

搜索历史记录

您还可以通过键入 !! 来使用 history 重新运行您输入的最后一个命令。 通过将其与 grep 配对,您可以搜索与文本模式匹配的命令,或者通过将其与 tail 一起使用,您可以找到您执行的最后几个命令。 例如

$ history | grep dnf
3  sudo dnf update -y
5  history | grep dnf

$ history | tail -n 3
4  history
5  history | grep dnf
6  history | tail -n 3

获得此搜索功能的另一种方法是键入 Ctrl-R 以调用对您的命令历史记录的递归搜索。 键入此命令后,提示符将更改为

(reverse-i-search)`':

现在您可以开始键入一个命令,并将显示匹配的命令,供您通过按 ReturnEnter 来执行。

更改已执行的命令

您还可以使用 history 以不同的语法重新运行命令。 您可以使用 history 修改历史记录。 例如,如果我想将我之前的命令 history | grep dnf 更改为 history | grep ssh,我可以在提示符下执行以下操作

$ ^dnf^ssh^

该命令将重新运行,但 dnfssh 替换。 换句话说,运行的是以下命令

$ history | grep ssh

删除历史记录

有时您可能想要删除历史记录文件中的一些或所有命令。 如果要删除特定命令,请输入 history -d <行号>。 要清除历史记录文件的全部内容,请执行 history -c

历史记录文件存储在一个您可以修改的文件中。 Bash shell 用户可以在他们的主目录中找到它,文件名为 .bash_history

下一步

您可以使用 history 做很多其他事情

  • 将您的历史记录缓冲区的大小设置为一定数量的命令
  • 记录历史记录中每行的日期和时间
  • 防止某些命令被记录在历史记录中

有关 history 命令以及您可以使用它执行的其他有趣的事情的更多信息,请查看 Seth Kenlon 关于解析历史记录历史记录搜索修饰符GNU Bash 手册的文章。


本文最初于 2018 年 6 月发布,并已由编辑更新了其他信息。

标签
Steve Morris
担任加拿大艾尔伯塔省卡尔加里市安布罗斯大学的信息技术总监。 在 Slackware 上磨练了他的 Linux 技术,但大部分时间都在 Ubuntu 或 Fedora 上度过。 空闲时间花在跑步上,努力完成第一次半程马拉松。

4 条评论

grep 和 tail 命令还有哪些其他用途?

不知道 Ctrl-R 方法。 非常感谢!

我将 "wdil" 别名为 "history | grep" 以搜索过去的命令,但 Ctrl-R 方法更加巧妙。 (“wdil”代表“何时我最后一次?”)

Creative Commons License此作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.