从多个 Konsole 保存 bash 历史记录无法正常工作

ind*_*joe 9 bash command-history

我使用多个 Konsole 终端。而且我希望我在每个终端中键入的所有命令都保存在命令历史记录中,以便我打开的下一个 konsole 将拥有所有这些命令。为了防止每个终端覆盖另一个终端的命令历史记录,我在我的.bashrc

# avoid duplicates and commands starting with space
export HISTCONTROL=ignoredups:erasedups:ignorespace
# append history entries..
shopt -s histappend
#My machine reboots without warning sometimes.Hence to save commands instantaneously.
export PROMPT_COMMAND="history -a"  
export HISTSIZE=1000
PS1="\[\e[1;34m\]\! \[\e[0m\]"$PS1
Run Code Online (Sandbox Code Playgroud)

我给了最后一行以在我的提示中查看命令编号。命令编号。从来没有超过 600,但我的一些旧命令仍然从历史中消失。有许多重复给出的命令,但正如预期的那样ignoredups,它永远不会在提示中增加命令 no。然而旧的命令还在消失,而历史上的命令数量总是保持在500多条。

.bash_history尽管忽略了文件,但该文件仍然包含许多重复项。

PS:echo$HISTSIZE和的输出$HISTFILESIZE都是=1000


更新:我在上面的.bashrc. 打电话是history -aPROMPT_COMMAND简单地附加上一个新的命令到.bash_history的。所以ignoredupserasedups没有效果。

有什么办法,我仍然可以写入 .bash_history 而不会从每个终端重复?我不想在每个命令提示符处加载整个历史记录history -r并用 再次写回history -w,因为我在一个终端中发出的命令也会出现在另一个并行运行的终端中。我希望组合命令仅出现在新终端中。

谜题,为什么我的历史被削减到 500 解决了。我注意到每次 ssh 进入这台机器时都会发生这种情况。.bash_profile使用以下条目创建一个解决了这个问题。

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
Run Code Online (Sandbox Code Playgroud)

现在我的 .bashrc 也会在每次 ssh 时执行。并且历史文件大小现在单调增加。

ind*_*joe 1

我得出的结论是,不可能直接附加新命令并同时删除任何重复项。所以我的解决方案是稍后运行以下命令。或者将其放入我的 crontab 中。

tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp 
mv $HOME/.hist_Temp $HOME/.bash_history
Run Code Online (Sandbox Code Playgroud)

上面的命令将保留命令的最后一次出现,并从历史文件中删除该命令之上的所有其他重复项,而不会打乱顺序。