当我遇到一些奇怪的事情时,我正在自定义 bash 提示符(我使用的是 OS X 10.7)。在我的提示中,我添加了 !,它应该给我历史记录编号。然而,历史记录编号始终从 501 开始,而不是 1。即使我重新启动终端也是如此。
我似乎找不到任何类似的东西,我想知道你们是否可以提供一些见解。
答案1
来自 man bash:
On startup, the history is initialized from the file named by the vari‐
able HISTFILE (default ~/.bash_history). The file named by the value
of HISTFILE is truncated, if necessary, to contain no more than the
number of lines specified by the value of HISTFILESIZE. [...] When an
interactive shell exits, the last $HISTSIZE lines are copied from the
history list to $HISTFILE.
虽然该文本非常清楚,但让我们通过示例来演示一下(这是一个 deb 系统,但 bash 是 bash)。
我现在的历史状态:
~$ set | grep HIST
HISTCONTROL=ignoredups:ignorespace
HISTFILE=/home/hmontoliu/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
由于 HISTFILESIZE 为 2000 而 HISTSIZE 为 1000,因此只有 HISTFILE 的最后 1000 行可用,因此您可能会得到这样的错误印象:我的历史从 1000 开始。
~$ history | head -1
1000 if i=1; then echo $i; done
~$ history | wc -l
1000
但实际上 HISTFILE 存储了最后 2000 个命令:
~$ wc -l $HISTFILE
2000 /home/hmontoliu/.bash_history
如果您认为这很烦人,您可以等于 HISTSIZE 和 HISTFILESIZE
~$ echo "export HISTSIZE=$HISTFILESIZE" >> .bashrc
~$ bash -l
~$ history | head -1
1 ls
~$ history | wc -l
2000
~$ set | grep HIST
HISTCONTROL=ignoredups:ignorespace
HISTFILE=/home/hmontoliu/.bash_history
HISTFILESIZE=2000
HISTSIZE=2000
最后提示:您应该运行help history
以查看可以使用您的历史
答案2
这来自hmonoliu的回答相当不错,这只是 TL;DR 版本。
bash 历史记录总是会从您上次停下的地方继续。它在您的主目录中的文件中保留运行命令的半永久历史记录。每次启动 bash shell 时,它都会加载此历史文件,并且您可以向上滚动到之前会话中运行的命令。如果历史记录中有 274 个以前的命令,则新 shell 上的命令历史记录编号将从 275 开始。
历史文件被截断为环境变量指定的最大长度$HISTFILESIZE
。显然,它已将历史文件截断为最多 500 行,因此每个新 shell 都从 501 开始。以前的历史记录项是以前 shell 中最后 500 项的集合。
答案3
默认情况下,历史记录保存在~/.bash_history
.交互式 shell 的历史记录在退出时保存到文件中,具体取决于 shell 中的设置。阅读 bash(1) 的联机帮助页并搜索“history”。