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

war*_*ren 40 linux bash

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

一个问题是,当我grep查看我的命令历史记录时,我发现我在不同的会话中发出了一个命令,并且必须分离并重新附加才能获取该历史记录项目。

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

inn*_*naM 44

您需要做两件事:

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

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

  • 我之前没有定义`PROMPT_COMMAND`,所以我不得不使用`PROMPT_COMMAND="history -a; history -n"` 来避免错误。 (8认同)
  • 谢谢你。我使用 PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n" 进一步改进了它。这样,其他会话中发出的命令会立即出现在当前会话的历史记录中(好吧,您需要先按 Enter 更新历史记录)。 (6认同)
  • 请参阅 http://superuser.com/a/734410/250287 答案以获取正确的历史 -a、-c 和 -r 命令。 (2认同)
  • 给新人提个醒:使用历史重写一段时间后,我意识到我经常发出错误的命令;当您在上一行中看到某些命令时,您希望向上箭头重复它,而使用此配置,情况不再总是如此。 (2认同)

Ada*_*ane 14

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

# unified bash history
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"
Run Code Online (Sandbox Code Playgroud)

使用换行符代替分号也是处理 PROMPT_COMMAND 丢失/重复分号问题的一种简便方法。

  • 是否有充分的理由不使用 `PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"` 代替? (2认同)
  • 这通常有效,但确实有一个有趣的功能,即在从其他窗口获取完全更新的历史记录(包括命令)之前,您必须询问“历史记录”两次。 (2认同)