即使我设置了,我的 .bash_history 仍然被截断:
export HISTSIZE=
export HISTFILESIZE=
在我的.bash_profile
.我不确定它何时发生,但当我注销或关闭计算机时可能会发生。由于我遇到这个问题已经有一段时间了,我尝试在我的 上设置相同的变量/etc/profile
,但这并不能解决问题。
它确实最多有 2000 行(这是我在截断之前看到的最大值),但有时它只是截断,我后来注意到了。我可以做什么来解决这个问题?
答案1
.bash_profile
仅当 bash 作为启动时才加载登录外壳。在 OSX 上,默认情况是在每个终端中启动一个登录 shell,因此这是您的常见情况。但是,如果您曾经输入bash
运行嵌套 shell,或者运行 screen 或 tmux,或者启动交互式 shell 的任何其他内容,那么您最终会得到一个交互式非登录 shell。这个 shell 只读取~/.bashrc
,不读取~/.bash_profile
。由于您导出HISTFILESIZE
到环境,从运行登录 shell 的终端启动的程序启动的 shell 将继承该设置。但是独立启动的 shell 不会(这是 OSX 在终端中启动登录 shell 的方法的一个基本缺陷。)因此,在不启动登录 shell 的终端模拟器内启动 shell,或者在由 cron 启动的屏幕会话中启动 shell job 或 Aquamacs 等中不会有任何HISTSIZE
或HISTFILESIZE
设置,因此将使用默认值。
解决方法是将HISTSIZE
和设置HISTFILESIZE
在正确的位置:在~/.bashrc
.
.bashrc
奇怪的是,Bash只从非登录交互式 shell 中读取。要在所有交互式 shell 中读取它,请将以下行放入您的.bash_profile
:
case $- in *i*) . ~/.bashrc;; esac
答案2
你必须检查所有加载了各种 shell 的文件。对我来说,结果是 /etc/bash.bashrc 文件包含这两行
HISTSIZE=1000
HISTFILESIZE=2000
我真的不能说为什么这很重要,因为我在 .bashrc 中重置了它们,但通过注释掉这些行,我让一切正常工作。
从 Debian 切换到 Ubuntu 后我开始看到这个问题。鉴于 Debian 上没有这些行,并且我从未在那里看到任何问题,我非常有信心这是最终的解决方案。
答案3
迟到的答复,但没有人提及;在某些发行版(也许是全部?)中,历史文件被截断当你设置变量的那一刻(对于管理内存历史记录的变量也必须如此)。您可以通过将以下代码片段添加到.bash_profile
(Mac)或.bashrc
(其他 Unix)并启动交互式bash
shell 来测试是否是这种情况:
HISTFILE=~/foo_history
for ((i = 0; i < 100; i++)); do echo >> $HISTFILE; done
echo 'history size' $(wc -l $HISTFILE) # should print 100
HISTFILESIZE=5
echo 'history size' $(wc -l $HISTFILE) # should print 5
这就是为什么在某些早期的默认启动文件设置变量后更改变量似乎不起作用的原因。