![从多个 Konsole 保存 bash 历史记录无法正常工作](https://linux22.com/image/25207/%E4%BB%8E%E5%A4%9A%E4%B8%AA%20Konsole%20%E4%BF%9D%E5%AD%98%20bash%20%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C.png)
我使用多个 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
我给出了最后一行来查看提示符中的命令号。命令号。从未超过 600,但我的一些旧命令仍然从历史记录中消失。有许多命令是重复给出的,但正如预期的那样ignoredups
,它永远不会在提示符中增加命令 no 。然而旧的命令仍在消失。历史上的命令数量始终保持在 500 多一点。
尽管忽略了文件,但该.bash_history
文件仍然包含大量重复项。
$HISTSIZE
PS:echo和的输出$HISTFILESIZE
都是=1000
更新:我在上面的条目中发现了问题.bashrc
。只需调用history -a
即可PROMPT_COMMAND
将最后一个新命令附加到 .bash_history 中。所以ignoredups
和erasedups
没有影响。
有什么办法,我仍然可以写入 .bash_history 而不从每个终端重复?我不想在每个命令提示符下加载整个历史记录history -r
并使用 再次写回history -w
,因为我在一个终端中发出的命令也会出现在另一个并行运行的终端中。我希望组合命令仅出现在新终端中。
为什么我的历史记录被削减到 500 的谜题已经解决了。我注意到每次我 ssh 进入这台机器时都会发生这种情况。.bash_profile
使用以下条目创建一个解决了这个问题。
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
现在我的 .bashrc 也会在每次 ssh 时执行。并且历史文件大小现在单调增加。
答案1
我得出的结论是,不可能直接附加新命令并同时删除任何重复项。所以我的解决方案是稍后运行以下命令。或者将其放入我的 crontab 中。
tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp
mv $HOME/.hist_Temp $HOME/.bash_history
上面的命令将保留命令的最后一次出现,并从历史文件中删除该命令之上的所有其他重复项,而不会打乱顺序。
答案2
它很丑陋,我确信sed
或者awk
会更好,但我尝试通过在我的中添加它来解决同样的问题.bashrc
:
export HISTFILE=.bash_history_`tty | python -c 'import sys ; sys.stdout.write(sys.stdin.read().strip().replace("/", "_"))'`
这将为您打开的每个终端创建一个单独的历史记录文件,但是如果您在 bash 中运行 bash,它将使用相同的历史记录,但不应覆盖。我将根据我的经验警告您。虽然这确实有效并且可以防止历史记录被覆盖,但您必须使用grep
多个文件来尝试查找您正在查找的历史记录,这有时可能非常耗时。