Bash(最常用的 Linux Shell)的工作机制就是如此:

  • 内存中的历史记录 (In-memory history):在每个会话进行时,您输入的命令会暂时保存在该会话的内存中。

  • 退出时写入文件 (Write on exit):只有当您正常退出(exit) 这个终端会话时,Bash 才会将内存中的历史记录追加(append)到历史记录文件(通常是 ~/.bash_history)中。

因此,如果您同时打开了 Terminal 1 和 Terminal 2:

  • 在 Terminal 1 中执行的命令,不会立即出现在 Terminal 2 的 history 命令里。

  • 只有先关闭 Terminal 1,它的历史记录才会被写入 ~/.bash_history 文件。之后,在 Terminal 2 中执行 history 命令,才能看到来自 Terminal 1 的命令(但 Terminal 2 之后新执行的命令还不会立刻写入文件)。

如何解决

通过修改 Bash 的配置,让每个命令在执行后立即写入历史文件,并且让 Bash 每次都从历史文件中重新读取历史记录。这样,所有终端会话的历史记录就能几乎实时地共享了。

操作步骤:

  1. 编辑您的 Bash 配置文件(通常是 ~/.bashrc),在文件的最后追加下面两行。

# Append to the history file, don't overwrite it
shopt -s histappend

# Force immediate write of command to history file and re-read it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
  • shopt -s histappend: 确保多个会话的历史记录是追加到 ~/.bash_history,而不是覆盖它。

  • PROMPT_COMMAND: 这是一个特殊的环境变量,它的值会在每个主提示符($PS1)显示之前作为命令执行。

    • history -a: (append) 立即将当前会话中新增的历史命令追加到 ~/.bash_history 文件。

    • history -c: (clear) 清空当前会话内存中的历史记录。

    • history -r: (read) 从 ~/.bash_history 文件重新读取历史记录到当前会话的内存中。

  1. 执行命令使配置生效

source ~/.bashrc

拓展

~/.bashrc 中设置以下变量来控制历史记录的行为:

# 设置历史记录文件的大小(行数)
export HISTFILESIZE=10000

# 设置内存中历史记录列表的大小(行数)
export HISTSIZE=2000

# 忽略重复的命令(忽略连续重复的)
export HISTCONTROL=ignoredups
# 或者忽略所有重复的(包括非连续的)
# export HISTCONTROL=erasedups

# 忽略某些命令(避免记录敏感或无用的命令,如 ls, pwd, exit 等)
export HISTIGNORE='ls:pwd:exit'

总结: