bash 中历史文件可以统一吗?

bash 中历史文件可以统一吗?

我经常screen在我的 Linux 桌面和服务器上运行多个会话。

这样做的问题是,当我grep浏览我的命令历史记录时,我发现我在不同的会话中发出了一个命令,并且必须分离并重新连接才能获取该历史记录项。

是否可以“强制”将多个会话中不同更新的历史记录全部转移到中心历史记录?

答案1

您需要做两件事:

  1. shopt -s histappend在您的 中插入命令.bashrc。这将附加到历史文件而不是覆盖它。
  2. 另外,在您的 中.bashrc插入,PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"每次 bash 显示提示时,历史文件都会被重写和重新读取。

编辑:感谢 e-t172 提供的history -n技巧

答案2

请不要使用history -a; history -n,它不会按预期工作,并且会在您的历史记录中留下许多重复、无序的命令。通常按预期工作的解决方案如下:

# unified bash history
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

使用换行符代替分号也是解决 PR​​OMPT_COMMAND 缺失/重复分号问题的一种简便方法。

答案3

这里的任何解决方案都不适合我,但确实有效的只是使用:

cat ~/.bash_history | grep something

代替

history | grep something

感谢所以回答。

答案4

在某些发行版中,PROMPT_COMMAND 默认未定义。例如,它在 Arch 中定义,但在 Debian 中未定义。

我的 Dropbox 中有一个 bashrc,我在跨发行版时使用它,它包括:

PROMPT_COMMAND="$( [ '$PROMPT_COMMAND' ] && echo $PROMPT_COMMAND; )history -a; history -n"

相关内容