问题描述
我常开很多很多终端的[现在我有7对这个工作区中打开]我经常搜索history
与grep
找到我刚写的一个最近的命令,但我不希望追捕终端,然后向上滚动并寻找它更多,等等。有时我的终端关闭,没有’exit,’,我写的所有东西都丢失了[有时候我需要一些我在被杀的终端上写的东西]。
那么是否有办法让每个终端立即写入.bash_history?或者至少每分钟一次,或者类似的事情?
最佳解决方案
一个简单的解决方案,详见Update Bash History in Realtime。
它说这些命令放在.bashrc配置中:
shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
第一个命令将.history
文件模式更改为追加。第二个配置history -a
命令在每个shell提示下运行。 -a
立即将当前/新行写入历史文件。
相关的zsh:
次佳解决方案
尝试把它放到你的.bashrc中:
shopt -s histappend # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
history -c
清除运行会话的历史记录。这将使历史计数器减少$ HISTSIZE的数量。 history -r
读取$ HISTFILE的内容并将它们插入当前正在运行的会话历史记录中。这会通过$ HISTFILE中的行数增加历史计数器。
我认为这意味着这些命令几乎可以立即得到(你有一个终端,写回声1秒终端回声2,第一个回声3并且按下箭头两次,你应该有回声2可用。终端有权访问已写入的内容。
第三种解决方案
我有一个包含大约100000个条目的大型历史文件,清除历史列表并读取整个历史文件(使用history -c
和history -r
)的变体会在显示提示之前引入显著的(可能为0.2秒)延迟。使用history -n
以便只从历史文件中读取新行会更快:
shopt -s histappend
PROMPT_COMMAND='history -a;history -n'
PROMPT_COMMAND
不必被导出,因为它是一个shell变量。