有什么方法可以解决 `export PROMPT_COMMAND='history -a'` 和 `HISTCONTROL=ignoredups:erasedups` 吗?

有什么方法可以解决 `export PROMPT_COMMAND='history -a'` 和 `HISTCONTROL=ignoredups:erasedups` 吗?

有什么办法可以解决export PROMPT_COMMAND='history -a'HISTCONTROL=ignoredups:erasedups

我在打开另一个 Bash shell 选项卡时使用前者导入当前未保存的历史行,但不幸的是它似乎附加了重复的行。看来 HISTCONTROL 选项仅在关闭 shell 时才有效。例如,我可以列出history但看不到重复项,但可以cat .bash_history并看到它们。

因此,我假设shopt -s histappend默认情况下或其他一些设置仅在关闭时将内存或临时存储中的重复数据删除历史记录保存到 .bash_history 中。

我试图export PROMPT_COMMAND='history -w; history -a'看看这是否会在附加之前写入已删除重复的历史记录,但这不起作用。

答案1

如果没有history -w. (顺便说一句,前者仅删除连续的重复项。)这会导致所有 shell 在每个新提示(按 Enter 或中断)上共享相同的近实时历史记录,这在选项卡中处理单独的内容时很多时候并不理想。

有一个流行的问题是如何在使用共同历史记录的同时解决重复数据删除问题。Bash 历史记录:“ignoredups”和“erasedups”设置与跨会话的共同历史记录冲突

我不需要实时的共同历史记录,但我确实希望保存历史记录并将其放在新的 shell 上就可以了。history -a做这个。使用export PROMPT_COMMAND='history -a'至少保存每个提示的历史记录。 (顺便说一句,-w 从文件写入 shell 列表,-a 将列表附加到文件。)

因此,在没有实时历史记录的情况下删除重复项的唯一方法是通过命令。 (我本来打算将其放入 cronjob 中,但现在似乎没有必要,请参阅底部的编辑评论。)

tac $HISTFILE | cat -n | sort -k2 -k1n | uniq -f1 | sort -nk1,1 | cut -f2- | tac > $HISTFILE

file1="/etc/cron.daily/bash_history_dedup"; echo '<command>' $file1; chmod +x $file1

也可以使用 cron 作业备份历史文件(用户、root x 每天、每月):

file1="/etc/cron.daily/backup_bash_history"; echo -e 'cp --force ~/.bash_history ~/.bash_history_bak" \nsu user -c "cp --force ~/.bash_history ~/.bash_history_bak"' > $file1 && chmod +x $file1

file1="/etc/cron.monthly/backup_bash_history"; echo -e 'cp --force ~/.bash_history ~/.bash_history_bak_monthly \nsu user -c "cp --force ~/.bash_history ~/.bash_history_bak_monthly"' > $file1 && chmod +x $file1

使用该命令进行重复数据删除后,我不再看到重复项。因此,这些可能是之前保存的历史列表中存在的。 erasedups 对这些没有影响。

顺便说一句,我确实发现这有助于跳过不带参数的命令:export HISTIGNORE="!(+(*\ *))"# 忽略不带参数的命令。与 HISTTIMEFORMAT 不兼容。应该是一样的grep -v -E "^\S+\s.*" $HISTFILE

答案2

问题是“原子”附加。中间立场history -a在“旧”中是手动的,然后history -n在新的 bash 中是手动的。 (这会将现有会话命令隐藏在新命令中;通过附加到命名文件,可以拼接历史记录)

相关内容