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 每次都从历史文件中重新读取历史记录。这样,所有终端会话的历史记录就能几乎实时地共享了。
操作步骤:
编辑您的 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
文件重新读取历史记录到当前会话的内存中。
执行命令使配置生效
source ~/.bashrc
拓展
在 ~/.bashrc
中设置以下变量来控制历史记录的行为:
# 设置历史记录文件的大小(行数)
export HISTFILESIZE=10000
# 设置内存中历史记录列表的大小(行数)
export HISTSIZE=2000
# 忽略重复的命令(忽略连续重复的)
export HISTCONTROL=ignoredups
# 或者忽略所有重复的(包括非连续的)
# export HISTCONTROL=erasedups
# 忽略某些命令(避免记录敏感或无用的命令,如 ls, pwd, exit 等)
export HISTIGNORE='ls:pwd:exit'
总结: