我经常打开很多很多的终端(现在,我在这个工作区上打开了七个)并且我经常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"
history -c
清除正在运行的会话的历史记录。这将使历史记录计数器减少 的数量$HISTSIZE
。history -r
读取 的内容$HISTFILE
并将其插入到当前正在运行的会话历史记录中。这将使历史记录计数器增加 中的行数$HISTFILE
。
我认为这意味着命令几乎可以立即使用(您有一个终端,写入echo 1
,第二个终端echo 2
,第一个echo 3
,按下向下箭头两次,就应该echo 2
可用。您必须在给定的终端中发出命令才能访问已写入的内容。
答案3
我有一个包含大约 100000 个条目的大型历史文件,清除历史列表并读取整个历史文件(使用history -c
和history -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
这是默认行为。