如何在Linux或MacOS终端中使用Bash历史记录

bash shell是大多数Linux发行版附带的标准终端环境,包含在MacOS中,可用于在Windows 10上安装。它会记住您键入的命令并将其存储在历史文件中。您可能知道一些bash历史的基础知识,但它的功能比您可能意识到的要强大得多。

键盘快捷键

相关:Bash的最佳键盘快捷键(也就是Linux和MacOS终端)

要滚动浏览bash历史记录,您可以使用bash的许多有用的键盘快捷键中的几个。按下这些快捷键,您以前使用过的命令将出现在提示符下。

向上箭头或Ctrl+P:转到历史记录中的上一个命令。多次按键可倒退浏览您使用过的命令。 向下箭头或Ctrl+N:转到历史记录中的下一个命令。多次按键向前浏览您使用过的命令。 Alt+R:如果在当前行上编辑了历史记录中的命令,则恢复对该命令所做的任何更改。

Bash还有一个特殊的“调用”模式,您可以使用它来搜索以前运行过的命令,而不是逐个滚动它们。

Ctrl+R:调用与您提供的字符匹配的最后一个命令。按此快捷键并开始键入以在bash历史记录中搜索命令。 Ctrl+O:使用Ctrl+R运行找到的命令。 Ctrl+G:在不运行命令的情况下退出历史搜索模式。

查看您的Bash历史记录

您可以通过运行以下命令将整个bash历史记录打印到屏幕上:

history

您将看到bash历史记录中所有命令的列表,每个命令的左侧都有一个数字。旁边带有“1”的命令是bash历史记录中最旧的命令,而编号最高的命令是最新的。

相关:使用以下8个技巧成为Linux终端高级用户

您可以随心所欲地处理输出。例如,您可以通过管道将其传递给grep命令,以搜索您的命令历史记录。

history | grep your_search

您还可以通过管道将其传递给Tail命令,以便只查看您最近运行的一小部分命令。例如,以下命令将显示历史记录中的最后5个条目。

history | tail -5

从您的历史记录中运行命令

Bash可以快速“扩展”之前的命令,或者对它们进行扩展和修改。此功能称为“历史扩展”,并使用一个感叹号,称为“bang”。只需在提示符下键入它们,然后按Enter键就可以像运行任何其他命令一样运行它们。

要从历史记录中按其编号运行特定命令,请使用以下命令:

!#

例如,假设您想从bash历史记录运行第12个命令。这就是当您运行HISTORY命令时,左边带有“12”的命令。您可以键入以下命令。

!12

要重新运行您上次运行的命令,请键入以下命令。这与按一次向上箭头查看上一个命令,然后按Enter键的效果相同。

!!

您还可以向后引用某个命令的特定行数。例如,!-2将运行您运行的倒数第二个命令。!!意思和!-1一样。

此扩展适用于生产线上的任何位置。您可以在本节中的!!或任何其他表达式之前或之后添加您喜欢的任何内容。例如,您可以键入以下命令来重新运行您通过sudo运行的最后一个命令,并赋予它root权限。如果您在运行命令之前忘记添加.sudo,这将特别有用。

sudo !!

或者,例如,您可以重新运行前面的命令,并通过管道将其输出传递给grep以搜索一些文本。

!! | grep text

要在您的历史记录中搜索命令并运行它,请键入以下内容。这将运行与您指定的文本匹配的最后一个命令:

!text

因此,如果您最近运行了一个以ping开头的命令,您可以运行以下命令来搜索它。这将向后搜索您的历史记录,找到以“pi”开头的最新命令,并立即运行它:

!pi

您可以将:p附加到上面的任何扩展中,bash会将命令打印到终端,而不会运行它。如果您想在运行之前确认选择的命令是正确的,这将非常有用。

!12:p!!:p!text:p

重用历史记录中的参数

Bash还允许您运行新命令,但使用历史记录中以前命令中的参数。这可以帮助您快速重用长参数或复杂参数,而不必重新键入它们。

command !$

例如,假设您运行命令Touch/home/chris/some_long_file_name_you_dont_want_to_type_again。现在您想要运行命令Nano/home/chris/some_long_file_name_you_dont_want_to_type_again.。您可以运行以下命令,而不是从头开始键入整个代码:

nano !$

$将使bash自动填充上一个命令的最后一个参数。

这只填充了最后一个参数。因此,如果您运行ping google.com-c4,然后运行ping!$,这将扩展为“ping 4”。

要解决这种情况,可以使用以下技巧来展开该行上的第一个参数,而不是最后一个参数:

command !^

因此,如果您运行ping google.com-c4,然后运行ping!^,bash会将其扩展为“ping google.com”。

要填充前面命令中使用的所有参数,而不仅仅是单个参数,您可以使用以下命令:

command !*

因此,如果您运行ping!*0,bash将自动填充您在前一个命令中使用的所有参数。

您可以使用与从历史记录中运行命令相同的技巧来获取参数。只要使用下面的表格就可以了。

command !abc:#

例如,我们在前面运行了命令sudo hostname ubuntu。如果我们运行以下命令,bash将向后搜索历史记录,以查找最后一个命令,该命令以我们键入的字母开头,并填写我们指定的参数。因此,如果我们运行echo!su:2,bash将向后搜索以“su”开头的最后一个命令,并填充其第二个参数“ubuntu”。

其他花招的效果可能与您的预期不谋而合。例如,用星号(称为通配符)替换数字会导致bash填充命令中的所有参数:

command !abc:*

重新运行上一个命令并对其进行修改

bash还允许您重新运行前面的命令并指定应该更改的内容。这对于更正命令中的拼写错误很有用。例如,以下命令将重新运行前面的命令,将其中的文本“abc”替换为文本“xyz”。

^abc^xyz

例如,如果您不小心运行了ping gogle.com,那么您可以运行^gog^GOOG,而bash将运行命令ping google.com。

您的历史记录存储在哪里,以及如何清除它

默认情况下,bash shell将您在用户帐户的历史文件中运行的命令的历史记录存储在~/.bash_History中。例如,如果您的用户名是bob,您将在/home/bob/.bash_History中找到此文件。

因为您的历史记录存储在一个文件中,所以它在会话之间保持不变。您可以运行一些命令,注销,第二天再回来,这些命令仍将保存在您的历史文件中,随时可供查看和使用。每个用户帐户都有自己的历史文件和单独的命令历史记录。

history -c

默认情况下,Bash只记住有限数量的命令,以防止历史文件变得过大。bash记忆的历史条目数由HISTSIZE变量控制。默认值通常为500或1000个条目。您可以运行以下命令来查看系统上bash历史记录的大小。

echo $HISTSIZE

要将您的历史记录设置为零,请运行以下命令。

HISTSIZE=0

对于当前会话,bash不会存储任何历史条目,除非您运行类似HISTSIZE=1000的命令将其设置回一定数量的历史条目。

如何忽略空格和重复项

如果将HISTCONTROL变量设置为IGNORE RESPACE,则BASH允许您忽略以空格开头的历史记录条目。

HISTCONTROL=ignorespace

在bash shell中运行命令之前,在命令前键入一个空格,该命令将正常运行,但如果您启用了此变量,则该命令不会出现在您的历史记录中。这使您可以保持历史记录的清晰度,选择在历史记录中不出现命令的情况下运行命令。

Bash还允许您忽略可能会扰乱您的历史记录的重复命令。要执行此操作,请将HISTCONTROL设置为Ignore redups。

HISTCONTROL=ignoredups

要同时使用IGNONORESPACE和IGNOREDUPS功能,请将HISTCONTROL变量设置为Ignore reBoth。

HISTCONTROL=ignoreboth

请注意,您设置的bash变量将仅在当前会话中持续存在。如果您愿意,您需要将这些值添加到用户帐户的.bashrc文件中,以便在每次启动bash会话时自动设置这些值。

bash shell是一个复杂的工具,具有比这些更多的选项。请参考官方bash手册中的Bash History Builtins和History Expansion部分,了解更详细的信息和其他您可以使用的高级技巧。

相关文章