有时历史命令不存储在 .bash_history 中

有时历史命令不存储在 .bash_history 中

昨天我在我的CentOS 7中发出了很多命令。但是今天当我想检索这些命令时,我发现没有任何记录。当我打开文件时.bash_history,我仍然找不到我昨天发出的命令,但我发现了许多几天前的旧命令。为什么最近的命令没有被存储?如何提高历史记录能力?

答案1

历史记录项不显示的最可能原因不是设置HISTFILE为空或HISTSIZE设置为零,而是通过两次登录同一台计算机并在第二个 bash 实例(其中您几乎没有执行任何操作)后退出,其中你做了很多。默认情况下,Bash 不会合并历史记录,第二个 Bash 退出会覆盖.bash_history第一个 Bash 退出很好地更新的历史记录。

为了防止这种情况发生,您可以附加到历史文件而不是覆盖,您可以使用histappendshell 选项:

如果启用了 histappend shell 选项(请参阅下面的 SHELL BUILTIN COMMANDS 下的 shopt 描述),则这些行将追加到历史文件中,否则历史文件将被覆盖。

更多详情请参阅这个答案包括如何使用HISTSIZEHISTFILESIZE控制HISTCONTROL大小、重复项等。

答案2

要修改历史记录大小HISTSIZE,请使用两个 BASH 变量HISTFILESIZE(通常在 中设置.bashrc)。

BASH 手册页的描述:

历史大小 命令历史记录中要记住的命令数量(请参阅下面的“历史记录”)。如果值为 0,则命令不会保存在历史列表中。小于零的数值会导致每个命令都保存在历史列表中(没有限制)。 shell 在读取任何启动文件后将默认值设置为 500。

历史文件大小 历史文件中包含的最大行数。当为该变量分配一个值时,如有必要,历史文件将被截断,通过删除最旧的条目来包含不超过该数量的行。当 shell 退出时,历史文件在写入后也会被截断为该大小。如果值为 0,历史文件将被截断为零大小。非数值和小于零的数值禁止截断。 shell 在读取任何启动文件后将默认值设置为 HISTSIZE 的值。

作为示例,我的.bashrc文件中有以下设置:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

答案3

验证您的HISTCONTROLshell 变量未设置为ignorespaceignoreboth

$ echo $HISTCONTROL
ignoredups  #this is ok

~/.bash_profile您可以通过设置您或您的~/.profile文件中的值来修改它:

HISTCONTROL=ignoredups

bash手册页:

组织控制

以冒号分隔的值列表,控制命令如何保存在历史列表中。

如果值列表包含ignorespace,则以空格字符开头的行不会保存在历史列表中。

ignoredups会导致与先前历史记录条目匹配的行不被保存。

的值ignorebothignorespace和 的简写ignoredups

erasedups会导致与当前行匹配的所有先前行在保存该行之前从历史记录列表中删除。

任何不在上面列表中的值都将被忽略。

如果HISTCONTROL 未设置,或者不包含有效值,则 shell 解析器读取的所有行都将保存在历史列表中,具体取决于 的值HISTIGNORE。多行复合命令的第二行和后续行不进行测试,并且无论 的值如何,都会添加到历史记录中HISTCONTROL

答案4

就像OP一样,我发现由于多个终端而丢失历史记录,以及它们可能退出的“随机顺序”令人烦恼。我希望能够将历史记录从一个终端传输到另一个终端,但我不希望它仅在需要时连续完成,或者在 shell 退出时保存它,将其与其他终端合并。

结果是这样的……

将磁盘上的“.bash_history”与内存中的 shell“history”合并。保留时间戳顺序以及这些时间戳内的命令顺序。

根据定义的 perl RE,可以选择删除唯一命令(即使是多行),和/或删除(清除)简单和/或敏感命令。调整以适应!

https://antofthy.gitlab.io/software/history_merge.bash.txt

我使用别名“hc”从“.bash_logout”获取脚本,但前提是我没有关闭历史记录保存(取消设置 $HISTFILE,- 在某些情况下是一种“私有”shell 会话)。

享受。

相关内容