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
命令,看看您可以在不键入命令的情况下完成多少工作。您可能会感到惊讶!
1 条评论