知方号

知方号

如何管理 Bash 历史记录

如何管理 Bash 历史记录

BASH (Bourne Again SHell) 是几乎所有基于 Linux 的操作系统中的默认 shell。我们在终端中编写的所有命令都由 shell 解释,并成为其历史记录的一部分。在本教程中,我们将了解 shell 历史记录的保存位置,以及如何使用“history”内置命令和一些环境变量来管理它。

在本教程中您将学习:

BASH 历史记录的保存位置和方式

如何可视化当前 shell 历史记录

如何清理 Bash shell 历史记录

如何强制将 shell 历史记录写入历史文件

如何通过环境变量修改历史行为

使用的软件要求和约定BASH 历史记录保存在哪里?

如果我们打开终端仿真器或者在 TTY 中工作,并且想要调用过去运行的命令,我们通常按上箭头键向后导航,或在 中按向下箭头键向前导航。 >外壳历史记录。您是否想知道 Bash 历史记录在哪里以及如何保存?我们在 Bash shell 中调用的命令列表存储在所谓的“历史文件”中,默认情况下为 ~/.bash_profile。

命令在文件中每行存储一个,但是,它们最初保留在内存中,并且仅在 shell 会话关闭时或当我们手动强制写入时写入(我们将在本节后面看到如何执行此类操作)教程)。

使用“history”内置命令

要可视化 shell 历史记录的当前内容,我们可以使用 history 命令,而不传递任何参数或选项。它生成的输出中的每一行都以数字为前缀:

$ history 1 echo "linuxconfig.org" 2 cat /etc/hostname 3 ls -l /etc/hostname 4 history清理 Bash shell 历史记录

history命令不仅用于显示当前shell历史记录,还可以执行其他操作。例如,要清除 Bash shell 的所有当前历史记录,我们所要做的就是使用 -c 选项调用它。

我们还可以通过使用 -d 选项并将行偏移量作为参数传递来删除历史记录中的特定命令。想象一下,我们想要从当前内存历史记录中删除第 1 行。我们将调用 history 命令,如下所示:

$ history -d 1

负数可以用作偏移量:如果我们这样做,行数将从列表的末尾开始。例如,将 -1 作为偏移量传递给 -d 选项将导致历史记录的最后行被删除。然而,当我们执行此类操作时,必须考虑一件事:删除将在 history -d 命令附加到列表本身之后发生,因此删除历史记录末尾的第三行,我们实际上应该运行 history -d -4。作为替代方案,我们可以更改配置,以使 history 等命令不包含在列表中。我们可以通过使用 HISTCONTROL 或 HISTIGNORE 变量来做到这一点:我们将在本教程的诅咒中看到如何做到这一点。

手动将历史记录写入文件

正如我们已经提到的,我们当前正在使用的 shell 的历史记录仅在 shell 会话关闭时才会写入历史文件。如果我们想强制在特定时间写入内存历史记录怎么办?我们可以再次使用history命令来执行此类操作。这次我们必须使用 -w 选项调用它,该选项不带任何参数:

$ history -w通过环境变量修改历史行为

可以通过设置某些环境变量的值来修改 shell 历史记录的行为。让我们看一些例子。

HISTCONTROL 变量

在上一节中,当我们讨论排除某些命令包含在 shell 历史记录中时,我们简要提到了 HISTCONTROL 变量。该变量采用冒号分隔的值“列表”,这些值影响命令如何包含在历史记录中。在大多数发行版上,其默认值只是ignoredups:

$ echo $HISTCONTROLignoredups

这是什么意思? ignoredups 值使得如果列表中的前一个命令与其相同,则命令不会记录在 shell 历史记录中,从而避免相邻重复。如果我们想避免整个 shell 历史中出现重复项,无论它们位于什么位置,我们都可以使用 erasedups 值。

该变量的另一个常用值是 ignorespace,它使得前面带有空格的命令不包含在 shell 历史记录中。让我们动态更新变量的值,并验证其是否有效:

$ HISTCONTROL="ignoredups:ignorespace"$ echo "this command will not be included in the history""this command will not be included in the history"$ history 1 HISTCONTROL="ignoredups:ignorespace"

首先,我们将 HISTCONTROL 变量的值从“ignoredups”更改为“ignoredups:ignorespace”,以便使用这两个值(我们可以简单地使用 ignoreboth 作为快捷方式)。更改变量值后,我们运行了两个命令,前面都有一个空格。最后一个history,显示历史内容。通过查看命令的输出可以看到,只有变量赋值包含在 shell 历史记录中,因为其他两个前面有一个空格。

不用说,按照我们上面的方式分配给 HISTCONTROL 变量的值将仅保留在当前 shell 会话中。为了使其永久化,我们应该将其分配到我们的 shell 环境文件中,然后注销并再次登录(或手动获取文件)。

HISTIGNORE 变量

就像 HISTCONTROL 变量一样,HISTIGNORE 接受以冒号分隔的元素列表作为值,但它用于指定应从 shell 历史记录中排除哪些命令。让我们看一个例子:假设我们想要排除 ls 和 history 命令不包含在 shell 历史记录中。这是我们分配给 HISTIGNORE 变量的值:

$ HISTIGNORE="ls:history"$ echo "this will be included in history""this will be included in history"$ lsfile.txt$ history 1 echo "this will be included in history"

正如您所观察到的,在我们更改分配给 HISTIGNORE 变量的值后,我们只是回显一条消息,然后运行 ls 和 history > 命令。从后者的输出中我们可以看到历史记录中只包含第一个命令。然而,应该注意一件事:只有我们在 HISTIGNORE 中指定的确切命令才会被排除。例如,上面我们将 ls 设置为排除,但是如果我们运行 ls -l,该命令将包含在 shell 历史记录中:

$ HISTIGNORE="ls:history"$ echo "this will be included in history""this will be included in history"$ ls -l-rw-rw-r--. 1 egdoc egdoc 0 Jan 7 11:51 file.txt$ history 1 echo "This ill be included in history" 2 ls -l

如何避免这种情况?我们可以简单地使用 * (glob)作为指定命令的一部分:它确实匹配每个字符。我们可以通过以下方式修改 HISTIGNORE 变量的值:

$ HISTIGNORE="ls *:history"$ echo "this command will be included in history"this command will be included in history$ ls -l-rw-rw-r--. 1 egdoc egdoc 0 Jan 7 11:51 file.txt$ history 1 HISTIGNORE="ls *:history" 2 echo "This command will be included in the shell history"HISTSIZE 变量

HISTSIZE 变量控制 Bash 历史记录中保存的命令数量。默认情况下,至少在我撰写

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。