如何在Linux或macOS终端中使用您的Bash历史记录

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

键盘快捷键

要滚动您的bash历史记录,您可以使用一些bash的许多有用的键盘快捷键 按照您之前使用的这些快捷方式和命令会出现在提示符下。

  • 向上箭头Ctrl + P :转到历史记录中的上一个命令。 按键多次,通过您使用的命令向后走。
  • 向下箭头Ctrl + N :转到历史记录中的下一个命令。 按键多次,通过您使用的命令前进。
  • Alt + R :如果您在当前行中对其进行了编辑,则将任何更改还原为从历史记录中提取的命令。

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

  • Ctrl + R :调用与您提供的字符匹配的最后一个命令。 按此快捷方式,然后开始输入以搜索您的bash历史记录以获取命令。
  • Ctrl + O :运行您使用Ctrl + R找到的命令。
  • Ctrl + G :保留历史搜索模式,不运行命令。

查看你的Bash历史

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

 历史 

你会看到你的bash历史记录中的所有命令的列表,以及每个命令左边的数字。 带有“1”的命令是您的bash历史记录中最早的命令,而最高的命令是最新的。

你可以做任何你喜欢的输出。 例如,您可以将其管道grep命令来搜索您的命令历史记录。

 历史|  grep your_search 

您也可以将其管道到tail命令,以查看您运行的最近的一些最近的命令。 例如,以下命令将显示历史记录中的最后5个条目。

 历史| 尾巴-5 

从你的历史运行命令

Bash可以快速“展开”先前的命令,或者展开它们并修改它们。 这个功能被称为“历史扩展”,并使用一个叫做“砰”的感叹号。 只需在提示符下键入它们,按Enter键即可运行它们,就像运行任何其他命令一样。

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

  !# 

例如,假设你想从你的bash历史运行第12个命令。 当您运行history命令时,它的左侧有一个“12”的命令。 您将键入以下命令。

  !12 

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

  !! 

您还可以将命令返回一定数量的行。 例如, !-2将运行您运行的第二个到最后一个命令。 !! 意味着与!-1相同的事情

这种扩展可以在任何地方工作。 你可以添加任何你喜欢之前或之后!! 或本节中的任何其他表达式。 例如,您可以键入以下命令以重新运行通过sudo运行的最后一个命令,从而赋予其root权限。 如果您在运行命令之前忘记添加sudo ,这将非常有用。

  sudo !! 

或者,例如,您可以重新运行上一个命令并将其输出管道输出到grep以搜索一些文本。

  !!  |  grep文字 

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

  !文本 

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

  !pi 

您可以将:p附加到任何上述扩展,并且bash会将命令打印到终端而不运行。 如果要确认您在运行该选项之前选择了正确的命令,这将非常有用。

  !12:p 
  !!:p 
  !文字:p 

从您的历史重用参数

Bash还允许您运行一个新命令,但是使用历史记录中先前命令的参数。 这可以帮助您快速重用长时间或复杂的参数,而无需重新输入。

 命令!$ 

例如,假设你运行命令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 -c 4然后运行ping !$ ,这将扩展到“ ping 4 ”。

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

 命令!^ 

所以,如果你运行ping google.com -c 4然后运行ping !^ ,bash会扩展为“ ping google.com"

要填写上一个命令中使用的所有参数,而不是单个参数,您可以使用以下命令:

 命令!* 

所以,如果你运行ping !* ,bash会自动填写你在上一个命令中使用的所有参数。

您可以使用与从历史记录中运行命令的相同技巧,从中获取参数。 只需使用以下形式。

 命令!abc:# 

例如,我们之前运行sudo hostname ubuntu命令。 如果我们运行以下命令,bash将通过历史记录向后搜索,以从我们键入的字母开始找到最后一个命令,并填写我们指定的参数。 所以,如果我们运行echo !su:2 ,bash会搜索到最后一个以“ su ”开头的命令,并填写第二个参数,即“ ubuntu ”。

其他技巧可以像您所期望的那样工作。 例如,使用星号(称为通配符)替换数字会导致bash从命令中填入所有参数:

 命令!abc:* 

重新运行上一个命令并修改它

Bash还允许您重新运行上一个命令并指定应该更改的内容。 这可以用于纠正命令中的打字错误。 例如,以下命令将重新运行上一个命令,将文本“ abc ”替换为文本“ xyz ”。

  ^ abc ^ xyz 

例如,如果您不小心运行ping gogle.com ,则可以运行^gog^goog并且bash将运行ping google.com命令。

存储您的历史记录,以及如何清除

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

由于您的历史记录存储在文件中,因此会在会话之间持续存在。 您可以运行一些命令,退出,第二天回来,这些命令仍然可以在您的历史文件中准备查看和使用。 每个用户帐户都有自己的具有单独命令历史的历史文件。

要清除您的bash历史记录,可以运行以下命令。 这将擦除用户帐户的.bash_history文件的内容:

 历史-c 

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

  echo $ HISTSIZE 

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

  HISTSIZE = 0 

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

如何忽略空格和重复

如果将HISTCONTROL变量设置为忽略空间,则Bash允许忽略以空格开头的历史条目ignorespace.

  HISTCONTROL =忽略空间 

在命令行前输入一个空格,然后在bash shell中运行命令,命令将正常运行,但如果启用了此变量,则不会显示在历史记录中。 这样可以让您的历史保持一点清洁,选择在没有出现在您的历史记录中的情况下运行命令。

Bash还允许您忽略可能会混淆您的历史记录的重复命令。 为此,将HISTCONTROL设置为ignoredups.

  HISTCONTROL = ignoreups 

要使用ignorespaceignoredups功能,请将HISTCONTROL变量设置为ignoreboth.

  HISTCONTROL = ignoreboth 

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

bash shell是一个复杂的工具,具有比这些更多的选项。 请参阅官方bash手册中的Bash历史内存历史扩展部分更详细的信息和其他可以使用的高级技巧。

如何使用Bash历史记录来提高命令行生产力

00 - banner

无论你是新手的Linux命令行,或者你是一个经验丰富的老将,这些技巧将有助于将你的基于文本的曲折成为完整的马拉松。 节省时间,提高您的生产力,并一次提高您的Linux-Fu!

历史命令

大多数这些技巧在某种方式利用“历史”命令,所以让我们先覆盖一个。 只需键入:

历史

就是这么简单! 您将输出类似于以下内容:

01 - history

要从历史记录执行特定命令,您只需键入惊叹号,然后输入历史记录列出的命令编号。 这里,我将重新执行命令510。

!510

02 - history ex1

顺便说一下,感叹号通常被称为“爆炸”。

你也可以参考一个命令多久前它运行。 接下来,让我们执行我们之前键入的三个命令。

!-3

03 - history ex2

快速替换

假设您要重新运行先前的命令。 只需键入两个感叹号。 这是完美的,当你运行一个需要超级用户权限的命令,你忘了这样做。 只要给它老的“sudo bang bang”治疗:

sudo!

04 - sudo bang bang

假设你想要使用最后一个参数运行一个命令。 打字是太冗长乏味了。 只需使用“bang dollar”自动替换您的最后一个参数。

cd!$

05 - bang dollar

如果你运行一个带有两个参数的命令,并且你想运行第一个? “Bang Bang”救救! 当你做一个配置文件的备份然后想要编辑它时,这工作得很好。

纳米

08 - bang caret

接下来,让我们从历史中搜索特定的命令。 Ctrl + R将向后搜索您键入的内容。 它会在您键入时自动完成,您可以使用箭头键滚动查找您要查找的特定实例。

06 - ctrl r

如果您知道使用特定关键字运行的最后一个命令,则可以跳过搜索过程,并按下按键至少一次。

!关键词

07 - bang keyword

现在,对于权力替换:您可以使用类似于上一个方法的替换参数为最后一个特定命令。 只需添加一个冒号和参数的编号。

ls!ln:2

在这里,我从我的最后ln命令替换第二个参数。

09 - bang keyword colon arg

正如你可以看到,我使用Ctrl + R查找来帮助说明这个参数来自哪里。

清理你的轨道

如果您想清除历史记录,请使用:

历史-c

如果您想完全禁用历史记录,请使用:

HISTSIZE = 0

要重新启用它,您只需将该值从0更改为其他值(默认值通常为500或1000)。

但你为什么要选择之间的全部或什么? 使用以下命令确保带有空格的所有命令不会记录在您的历史记录中。

HISTCONTROL =忽略空间

在第四行,我带领一个空格的“cd”命令。

10 - histcontrol ignorespace

另外,请注意,我通过使用管道(|)和tail命令仅列出了最近4个历史记录条目。 你可以将4改为其他任何东西,以获得相同的效果。

这里没有重复

我喜欢使用Bash的历史。 我不喜欢的一件事是重复的。 使用以下命令忽略重复的条目:

HISTCONTROL = ignoredups

11 - histcontrol ignoredups

如果你想使用ignorespace和ignoredups,你需要使用ignoreboth。

HISTCONTROL = ignoreboth

假装忙

作为一个奖励给你如何Geek读者,我会包括以下,完全不相关的命令:

cat / dev / urandom | hexdump -C | grep“ca fe”

这将不断生成随机字符和值在一个特定的格式,这是很好的盯着治疗的原因。

12 - coffee

它也可以派上用场,以便你想看起来忙或在工作中快速喝咖啡休息。 不要对这一个负责,家伙。 ;-)

你最喜欢哪些技巧? 有一个最喜欢我们没有在这里列出? 在评论中分享您的想法!

赞 (0)
分享到:更多 ()