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

时间:2020-03-21 11:44:08  来源:igfitidea点击:

在本简要教程中,我们将学习如何在Linux中避免Bash历史记录中的重复条目。
从命令行工作时,我们可能多次运行一些Linux命令。
如我们所知,我们在终端中运行的每个命令都保存在历史记录文件中。
因此,一遍又一遍地执行相同的命令将填满历史文件。
迟早,我们将最终在历史文件中有太多重复条目。

默认情况下,500个命令条目存储在历史记录文件中。
在最近的Ubuntu系统中,文件大小为1000.一旦命令条目的数量越过默认限制,就会从历史记录列表中删除最旧的条目。
因此,我们无法检索旧条目。
当然,我们可以增加历史文件大小,并根据需要保存尽可能多的条目。
但是,代替增加历史文件大小,避免在历史文件中保存重复项会更好。

查找历史文件位置

命令历史记录是按用户存储的特定于shell 的功能。
根据我们使用的shell,历史文件保存在特定文件中。
在使用BASH的Linux系统中,默认情况下,命令保存在~/.bash_history文件中。
我们可以通过运行以下命令查看shell历史文件的位置:

$echo $HISTFILE

其中histfile是一个变量,用于定义保存命令历史记录的文件的名称。

来自My Ubuntu Desktop的示例输出:

/home/sk/.bash_history

在CentOS 8中,我收到以下输出:

/root/.bash_history

更改历史文件位置

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

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

在上面的命令中替换"~/.custom_file"。

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

$source ~/.bashrc

现在让我们了解如何在~/.bash_history文件中避免多次保存相同的命令。

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

我们使用"历史记录"命令检索上次执行的命令。
看看以下示例:

$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变量来控制这些重复项。
HistControl可以具有以下值:

  • IgnorEspace - 以空格开头的行不会在历史记录中保存。
  • 忽略 - 不会保存匹配先前历史记录条目的行。换句话说,忽略重复项。
  • Ignoreboth - 它是"IgnoreSpace"和"Ignoredups"值的简写。如果将这两个值设置为histControl变量,则不会保存以空格和重复项开头的行。
  • 替代 - 消除整个历史上的重复。

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

$nano ~/.bashrc

最后添加以下行:

export HISTCONTROL=ignoredups

保存并关闭文件。
其中我们将HistControl变量前缀为"Export"。
它意味着所有子进程都可以使用变量。

或者,使用以下单行:

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

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

$source ~/.bashrc

或者,注销并重新登录使更改生效。

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

$history

我们还可以将多个值设置为HistControl变量,其中包含以下冒号分隔:

export HISTCONTROL=ignoredups:erasedups