我无法在所有终端中立即更新 bash 历史记录

我无法在所有终端中立即更新 bash 历史记录

我正在使用全新安装的 Ubuntu 22.04.3,带有 gnome-terminal,并且我没有直接编辑 ~/.bashrc。各种消息来源都说添加以下内容可以实现我想要的:

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

我那么source ~/.bashrc

我想要的是发生以下情况。我打开两个终端窗口。首先,我执行echo 1.在第二个我执行echo 2.在第一个中,我按向上箭头,然后我看到了echo 2。相反,我看到的是echo 1。这就是说 bash 窗口历史记录是相互独立的。如果我关闭窗口,然后重新打开一个窗口,那么历史记录将被合并,但我希望在执行命令时更新所有窗口的历史记录。

我怎样才能实现这个目标?

答案1

history -a通过将命令作为字符串的一部分,您似乎可以在每个提示之前正确调用该命令$PROMPT_COMMAND。这会将当前内存中的历史记录附加到历史文件中。

但是,将历史记录附加到历史文件不会自动来自同一文件的更新历史记录,因此您需要使用history -n.该命令将“读取尚未从历史文件中读取的所有历史行,并将它们附加到历史列表中”(来自help historyshell 中)。 “历史列表”是内存中的命令行历史记录。

这意味着:

PROMPT_COMMAND="history -a; history -n; $PROMPT_COMMAND"

或者,如果您想在从历史文件中重新读取所有历史记录之前清除内存中的历史记录(如果您发现上述命令在历史记录中的顺序不直观,则可能需要使用此选项):

PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

请注意,如果您多次编辑source该文件,则会向字符串中添加越来越多的内容。如果您有这样做的习惯,那么这样做可能会更好:.bashrc$PROMPT_COMMAND

original_prompt_command=${original_prompt_command-$PROMPT_COMMAND}
PROMPT_COMMAND="history -a; history -n; $original_prompt_command"

如果未设置,则将变量的值设置original_prompt_command为变量的值。然后使用这个新变量来更新.效果是,如果文件被多次获取,PROMPT_COMMANDoriginal_prompt_commandPROMPT_COMMAND原来的 $PROMPT_COMMAND值将始终被扩展,并且您不会得到越来越长的字符串。

相关内容