如何在 Linux 中避免 Bash 历史记录中的重复条目

在这个简短的指南中,我们将学习如何避免在 Linux 中的 Bash 历史记录中出现重复条目​​。 从命令行工作时,您可能已经多次运行某些 Linux 命令。 如您所知,我们在终端中运行的每个命令都保存在历史文件中。 所以一遍又一遍地执行相同的命令会填满历史文件。 迟早,您将在历史文件中得到太多重复的条目。

默认情况下,历史文件中存储了 500 个命令条目。 在最近的 Ubuntu 系统中,文件大小为 1000。一旦命令条目的数量超过默认限制,最旧的条目将从历史列表中删除。 因此,您无法检索旧条目。 当然,您可以增加历史文件大小并保存任意数量的条目。 但是,与其增加历史文件的大小,不如避免在历史文件中保存重复项。

查找历史文件位置

命令历史是一个特定于 shell 的功能,存储在每个用户的基础上。 根据您使用的 SHELL,历史文件保存在特定文件中。 在使用 Bash 的 Linux 系统中,命令保存在 ~/.bash_history 默认文件。 您可以通过运行以下命令来检查 shell 历史文件的位置:

$ echo $HISTFILE

这里,HISTFILE 是一个变量,用于定义保存命令历史的文件的名称。

我的示例输出 Ubuntu 桌面:

/home/sk/.bash_history

CentOS 8,我得到以下输出:

/root/.bash_history

更改历史文件位置

如果要更改默认位置,请运行:

$ echo "export HISTFILE=~/.custom_file" >>~/.bashrc

在上述命令中将“~/.custom_file”替换为您自己的。

运行以下命令以应用更改:

$ source ~/.bashrc

现在让我们看看如何避免在 ~/.bash_history 文件。

在 Linux 中避免 Bash 历史记录中的重复条目

我们使用“历史”命令检索最后执行的命令。 看看以下 example:

$ history | grep ls

样本输出:

    8  lsb_release -a
   13  ls -l
   14  lsb_release -a
   17  ls -l
   20  ls -l
   23  lsb_release -a
   27  ls
   29  lsb_release -a
   32  ls
   36  ls
   42  ls
   44  lsb_release -a
   62  history | grep ls

正如您在上面的输出中看到的那样, “ls” 命令已被记录多次。 我们可以控制这些重复使用 历史控制 多变的。 HISTCONTROL 可以具有以下值:

  • 忽略空间 – 以空格开头的行不会保存在历史记录中。
  • 忽略不计 – 与上一个历史条目匹配的行将不会被保存。 换句话说,重复项被忽略。
  • 两者都忽略 – 它是“ignorespace”和“ignoredups”值的简写。 如果将这两个值设置为 HISTCONTROL 变量,则不会保存以空格开头的行和重复项。
  • 擦除 – 消除整个历史中的重复。

因此,为避免在 Linux 中的 Bash 历史记录中出现重复条目​​,请编辑您的 ~/.bashrc 文件:

$ nano ~/.bashrc

在末尾添加以下行:

export HISTCONTROL=ignoredups

Save 和 close 文件。 在这里,我们在 HISTCONTROL 变量前加上“export”。 这意味着该变量可用于所有子流程。 更多细节, 这里.

或者,使用以下单线:

$ echo "export HISTCONTROL=ignoredups" >>~/.bashrc

现在运行以下命令以使更改生效:

$ source ~/.bashrc

或者,注销并重新登录以应用更改。

从现在开始,重复的条目将不会被记录。 您可以通过多次运行相同的命令来验证它,并使用以下命令查看历史列表:

$ history

您还可以使用冒号分隔的 HISTCONTROL 变量设置多个值,如下所示:

export HISTCONTROL=ignoredups:erasedups

有关更多详细信息,请参阅 Bash 手册页:

$ man bash

相关阅读:

  • 如何在 Linux 中清除命令行历史记录
  • 如何在 Linux 中从 Bash 历史记录中清除特定命令
  • 如何在没有行号的情况下显示 Bash 历史记录

感谢您的光临!

帮助我们帮助您:

祝你有美好的一天!!