是否可以立即写入 .bash_history ?

是否可以立即写入 .bash_history ?

我经常打开很多很多的终端(现在,我在这个工作区上打开了七个)并且我经常history用来grep搜索我最近刚刚写的命令,但是我不想搜索终端然后向上滚动并搜索它。

有时我的终端没有关闭exit,我在其中写入的所有内容都会丢失。有时,我需要在被终止的终端中写入的内容。

有没有办法让每个终端.bash_history立即写入?或者至少每分钟一次,或者类似的?

答案1

一个简单的解决方案详述实时更新 Bash 历史记录

它说把这些命令放在.bashrc 配置中:

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

第一个命令将历史文件模式更改为追加,第二个命令配置命令history -a在每个 shell 提示符下运行。该-a选项会history立即将当前/新行写入历史文件。

man bash

如果启用了 histappend shell 选项(参见下面 Shell 内建命令 (SHELL BUILTIN COMMANDS) 下对 shopt 的描述),则行将附加到历史文件,否则历史文件将被覆盖。

与 Zsh 相关:

答案2

尝试将其放入您的.bashrc

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

信用:https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -c清除正在运行的会话的历史记录。这将使历史记录计数器减少 的数量$HISTSIZEhistory -r读取 的内容$HISTFILE并将其插入到当前正在运行的会话历史记录中。这将使历史记录计数器增加 中的行数$HISTFILE

我认为这意味着命令几乎可以立即使用(您有一个终端,写入echo 1,第二个终端echo 2,第一个echo 3,按下向下箭头两次,就应该echo 2可用。您必须在给定的终端中发出命令才能访问已写入的内容。

答案3

我有一个包含大约 100000 个条目的大型历史文件,清除历史列表并读取整个历史文件(使用history -chistory -r)的变体在显示提示之前引入了明显的(可能 0.2 秒)延迟。使用history -n以便只从历史文件中读取新行会更快:

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMAND不需要导出,因为它是一个 shell 变量。

答案4

对于所有其他答案(基本上是同一件事)的注释:

PROMPT_COMMAND="history -a;$PROMPT_COMMAND"在(或朋友)中设置.bashrc就足够了。

此外,您可以history -a随时手动运行以“快照”当前会话中的历史记录。

该命令shopt -s histappend不是必需的,因为它history -a始终会将新行附加到文件,并且永远不会覆盖它。此外,至少从 Bash 4 开始,histappend这是默认行为。

相关内容