随着我在终端会话中花费的时间越来越多,我感觉自己不断发现新的命令,这些命令使我的日常任务更加高效。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 中,因此根据您使用的是 Bash、tcsh、Zsh、dash、fish、ksh 等,history 的行为可能会有所不同。本文基于 Bash 实现的 history,因此某些功能可能在其他 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
您还可以使用 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)`':
现在您可以开始键入命令,并且将显示匹配的命令,您可以通过按 Return 或 Enter 来执行它们。
更改已执行的命令
您还可以使用 history
以不同的语法重新运行命令。您可以使用 history
修改 history。例如,如果我想将我之前的命令 history | grep dnf
更改为 history | grep ssh
,我可以在提示符下执行以下操作
$ ^dnf^ssh^
该命令将重新运行,但 dnf
被替换为 ssh
。换句话说,此命令将运行
$ history | grep ssh
删除 history
有时您可能想要删除 history 文件中的一些或所有命令。如果您想删除特定的命令,请输入 history -d <行号>
。要清除 history 文件的全部内容,请执行 history -c
。
history 文件存储在一个您可以修改的文件中。Bash shell 用户可以在他们的主目录中找到它,文件名为 .bash_history
。
下一步
您可以使用 history
执行许多其他操作
- 将您的 history 缓冲区大小设置为特定数量的命令
- 记录 history 中每行的日期和时间
- 防止某些命令被记录在 history 中
有关 history
命令以及您可以使用它执行的其他有趣操作的更多信息,请查看 Seth Kenlon 关于 解析 history、history 搜索修饰符 和 GNU Bash 手册 的文章。
本文最初于 2018 年 6 月发布,并由编辑更新了其他信息。
4 评论