破碎的历史

破碎的历史

在gui模式下,当一个用户打开多个终端时,终端如何重写该用户的历史文件?我问的原因是因为,用户很可能在每个终端中最终执行不同的命令。那么,历史文件最终是保存来自所有终端的命令还是仅保存第一个打开的终端的命令?或者是否有其他类型的方案可以用来解决这种情况?

答案1

这完全取决于 shell 选择如何处理它

bash默认情况下,每个 shell 退出时都会用本地历史记录覆盖历史文件,因此最后退出的 shell 获胜。这histappend选项将导致它附加到主历史记录中 ( shopt -s histappend)。

zsh默认情况下执行相同的操作,并且有一些处理它的选项:

  • appendhistory-- 当 shell 退出时,每个 shell 的历史记录都会附加到主历史记录文件中
  • incappendhistory-- 每次在任何 shell 中执行一行时都会更新主历史文件,而不是等到该 shell 退出
  • sharehistory-- 与 类似incappendhistory,但还将更改从主历史文件拉入所有正在运行的 shell,因此您可以在一个 shell 中运行命令,然后Up在另一个 shell 中运行并查看它

答案2

我最初是从 O'Reilly 的《Unix Power Tools》一书中得到这个想法的。

在我的.profile我设置:

export HISTFILE=$HOME/.sh_hist.$$

每次.profile读取我的内容时,我都会得到一个以会话 PID 命名的新历史记录文件。如果我有多个登录,则每次登录都会获得一个唯一的历史记录文件。工作于kshbash

如果您只是在 X 会话中打开新终端,这些终端通常不是登录 shell,但您可以将它们配置为充当登录 shell。例如,将作为登录 shellrxvt +ls启动。rxvt检查您使用的任何终端的文档。

另外,除非您使用.logoutor.bash_logout文件(或其他方式)进行清理,否则您最终将得到一堆垃圾.sh_hist文件。

答案3

tcshset savehist = (5000 merge)合并

相关内容