BASH历史记录在每次登录时被截断为500行

Modified on: Sat, 12 Jan 2019 08:40:02 +0800

出于某种原因,我无法让我的系统在重启后保留我的BASH历史记录。以下是我的~/.bashrc的相关部分:

shopt -s histappend
PROMPT_COMMAND='history -a; updateWindowTitle'
export HISTCONTROL=ignoredups
export HISTSIZE=9999
export HISTFILESIZE=999999
export HISTFILE="$HOME/.bash_history"

据我所知,这些都是必要的选项(我知道我曾经能够在多次重新启动时保留历史记录,而过去没有所有这些选项)。然而,尽管在几次重新启动之前添加了这些选项,但在重新启动后我仍然失去了大部分历史记录。它不是空的,但它没有重启前的9999行。

在有人抱怨之前,是的,我已经阅读了这些问题。我已经实施了上面列出的一些建议,其余的都是无益的或不相关的:

如果有可能有其他相关命令,你可以查看我的整个~/.bashrc 这里

那么,我错过了什么?为什么我的历史没有保存?如果有人认为其他文件可能相关,请告诉我,我会发布。我通过在grep -i hist \.*中运行$HOME进行检查,其中显示了包含字符串.HIST.bashrc

我正在运行Linux Mint Debian Edition,GNU bash,版本4.2.36(1)-release(x86_64-pc-linux-gnu)和我最喜欢的终端模拟器(如果相关)是terminator


更新:

在评论中关注@ mpy的建议后,我将~/.bashrc更改为设置HISTFILE=~/bash_history,而不是默认的~/.bash_history,这似乎解决了交互式shell的问题。登录shell仍然显示相同的行为,历史记录在500行处被截断。但是,相关文件中没有设置HIST相关变量:

/ etc / profile~ / .profile~ / .bash_profile~ / .bash_login中的

$ for f in /etc/profile ~/.profile ~/.bash_profile ~/.bash_login; do \
   echo -ne "$f :"; echo `grep HIST $f`; \
done
/etc/profile :
/home/terdon/.profile :grep: /home/terdon/.profile: No such file or directory
/home/terdon/.bash_profile :grep: /home/terdon/.bash_profile: No such file or directory
/home/terdon/.bash_login :grep: /home/terdon/.bash_login: No such file or directory
$ grep -r HIST /etc/profile.d/  <-- returns nothing

那么,为什么在HISTSIZE中设置HISTFILESIZE~/.bashrc是不够的,除非我明确设置$HISTFILE到默认~/.bash_history以外的东西?

作者:Community,terdon

最佳答案

问题实际上归结为登录和非登录shell的不同行为。我在~/.bahsrc中设置了控制历史记录的变量。当一个人启动登录shell时,不会读取该文件,它只能由交互式非登录shell(来自man bash)读取:

  

当bash被调用为交互式登录shell时,或者作为
  非交互式shell使用--login选项,它首先读取
  并执行来自文件/etc/profile的命令,如果该文件
  存在。读完该文件后,它会查找〜/ .bash_profile,
  ~/.bash_login~/.profile,按此顺序,并读取和
  从第一个存在的命令执行命令
  可读。 shell是的,可以使用--noprofile选项
  开始抑制这种行为。

  
  

[。 。 。 ]

  
  

当启动不是登录shell的交互式shell时,
  bash从〜/ .bashrc读取并执行命令,如果该文件
  存在。使用--norc选项可以禁止这一点。该
  --rcfile file选项将强制bash从文件中读取和执行命令,而不是〜/ .bashrc。

因此,每次登录或删除tty或使用ssh时,.history文件都会被截断,因为我没有在~/.profile。我终于实现了这一点,只需在~/.profile中设置变量它们属于哪里而不是~/.bashrc

所以,我的~/.history被截断的原因是因为我只在交互式非登录shell读取的文件中设置了HISTORY变量,因此每次运行不同的变量将被忽略的shell类型,文件将被相应地删除。

作者:Community,terdon

相关问答

添加新评论