如何使用 Bash 历史命令

Bash 的 history 命令在功能数量上超越了所有其他 Linux shell 历史界面。
64 位读者喜欢这篇文章。
Compute like it's 1989

LSE 图书馆。由 Opensource.com 修改。CC BY-SA 4.0

Bash 拥有丰富的历史。也就是说,它是一个古老的 shell,拥有更古老的祖先(Bourne shell),但它也拥有出色的 history 命令,该命令在功能数量上超越了所有其他 shell 历史界面。Bash 版本的 history 允许反向搜索、快速调用、重写历史等等。

history 命令不像许多其他命令。您可能习惯于命令是放置在常见系统级位置(如 /usr/bin/usr/local/bin~/bin)的可执行文件。内置的 history 命令不在您的 PATH 中,也没有物理位置。

$ which history

which: no history in [PATH]

相反,history 是 shell 本身的内置函数。

$ type history
history is a shell builtin
$ help history
history: history [-c] [-d offset] [n] or 
history -anrw [filename] or 
history -ps arg [arg...]

Display or manipulate the history list.
[...]

因此,每个 shell 中的 history 函数都是独一无二的,因此您在 Bash 中使用的可能不适用于 Tcsh 或 Fish 或 Dash,而您在这些 shell 中使用的可能不适用于 Bash。在某些情况下,了解 Bash 可以做什么可能会启发其他 shell 的用户创建有趣的 hack 来克隆 Bash 行为,并且可能会解锁您从未知道存在的 Bash 功能。

查看您的 Bash 历史

history 命令最基本和最常用的用途是查看您的 shell 会话的历史记录。

$ echo "hello"
hello
$ echo "world"
world
$ history
  1  echo "hello"
  2  echo "world"
  3  history

事件指示符

事件指示符通过事件搜索您的历史记录。在此上下文中,事件是记录在您的历史记录中的命令,由换行符分隔。换句话说,它是一行,标有索引号以供参考。

事件指示符通常以感叹号开头,有时也称为 bang (!)。

要重新运行历史记录中的命令,请使用感叹号,后跟您想要命令的索引号(没有空格)。例如,假设第 1 行包含命令 echo "hello",并且您想再次运行它。

$ !1
echo "hello"
hello

您可以使用相对定位,方法是从历史记录中的当前位置向后提供负行数。例如,要返回历史记录中的三个条目。

$ echo "foo"
foo
$ echo "bar"
bar
$ echo "baz"
baz
$ !-3
echo "foo"
foo

如果您只是返回一行,则可以使用速记 !! 而不是 !-1。这可以节省整整一个击键!

$ echo "foo"
$ !!
echo "foo"
foo

您还可以反向搜索条目中的特定字符串,以查找要运行的命令。要搜索特定字符串开头的命令,请使用感叹号,后跟您要搜索的字符串(没有空格)。

$ echo "foo"
$ true
$ false
$ !echo
echo "foo"
foo

您还可以搜索在任何位置(不仅仅是在开头)包含字符串的命令。为此,请使用 ! 加上您要搜索的字符串,像往常一样,但在字符串的两端用问号括起来。如果您知道字符串紧跟换行符(意味着它是您在按 Return 之前键入的最后一件事),则可以省略尾随问号。

$ echo "foo"
$ true
$ false
$ !?foo?
echo "foo"
foo

字符串替换

与在行首搜索字符串类似,您可以搜索字符串并将其替换为新字符串,从而更改命令。

$ echo "hello"
hello
$ echo "world"
world
$ ^hello^foo
echo "foo"
foo

让历史记录变得有用

在 Bash 中,history 命令的功能远不止此处介绍的这些,但这对于习惯于使用您的历史记录而不是仅仅将其视为参考是一个良好的开端。经常使用 history 命令,看看您可以在不键入命令的情况下完成多少工作。您可能会感到惊讶!

接下来阅读什么

开始 Bash 编程

了解如何使用 Bash 编写自定义程序来自动化您的重复性任务。下载我们的新电子书开始学习。

Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,并且经常同时进行。

1 条评论

增加 Bash 历史记录大小。增加 HISTSIZE – 命令历史记录中要记住的命令数(默认值为 500)。增加 HISTFILESIZE – 历史记录文件中包含的最大行数(默认值为 500)。

© . All rights reserved.