我是 Unix&Linux 的新手,想对另一个问题的已经详尽的方法发表评论。我的代表还不到 50 岁(悲伤),所以它不会让我这么做。我尝试了这个问题的解决方案:在多个终端窗口中保留 bash 历史记录
export HISTCONTROL=ignoredups:erasedups # no duplicate entries
export HISTSIZE=100000 # big big history
export HISTFILESIZE=100000 # big big history
shopt -s histappend # append to history, don't overwrite it
# Save and reload the history after each command finishes
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
不幸的是,这导致的结果是,虽然我有一个不断增长的(合并的)历史记录(期望的),但在新窗口中,我无法再使用“向上箭头”循环浏览其中的任何一个(不期望的)。也就是说,我只能循环执行在新窗口中执行的命令。例如,如果我打开一个新终端并收到 500 行历史记录,我会执行 3 个命令,我只能使用向上箭头循环浏览这些 501-503...
我打开一个新终端并执行以下操作:
$ history #enter
.
.
584 foo
585 bar
.
.
600 baz
$ history #enter
1 history
有人可以解释为什么会这样吗?是否有解决方法?谢谢。
答案1
似乎可以从我发布的链接中的评论部分导航到解决方案:请参阅Bash 历史记录:“ignoredups”和“erasedups”设置与跨会话的共同历史记录冲突
而不是:
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
使用:
PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"
答案2
拥有 bash 有历史记录(并写入历史记录)的所有位置的历史记录的原因是,您正在写入文件(history -a),而所有其他 bash shell 都是还写入同一个文件。
然后,您将文件(history -r)中的所有命令读取到内存中。
作为解决方案,您可以将(新)命令写入文件 (history -a),但不读取生成的文件。命令列表在记忆中将属于正在运行的 bash 的每个实例。 bash 的每个实例都会有不同的命令列表。所有命令都将写入历史文件。
用于bashrc或类似):
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"