Bash 历史编号不是从 1 开始?

its*_*hen 7 bash prompt command-history terminal

当我遇到一些奇怪的事情时,我正在自定义我的 bash 提示(我在 OS X 10.7 上)。在我的提示中,我包含了 !,它应该给我历史编号。然而,历史编号总是从 501 开始,而不是 1。即使我重新启动终端也是如此。

我似乎找不到任何接近于此的东西,我想知道你们是否可以提供一些见解。

hmo*_*liu 8

从人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.
Run Code Online (Sandbox Code Playgroud)

虽然这段文字很清楚,但让我们举个例子(这是一个 deb 系统,但 bash 是 bash)。

我现在的历史状态:

~$ set | grep HIST
HISTCONTROL=ignoredups:ignorespace
HISTFILE=/home/hmontoliu/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
Run Code Online (Sandbox Code Playgroud)

由于 HISTFILESIZE 是 2000 并且 HISTSIZE 是 1000,因此只有 HISTFILE 的最后 1000 行可用,因此您可能会错误地认为我的历史记录从 1000 开始。

~$ history | head -1
 1000  if i=1; then echo $i; done

~$ history | wc -l
1000
Run Code Online (Sandbox Code Playgroud)

但确实 HISTFILE 存储了最后 2000 个命令:

 ~$ wc -l $HISTFILE
2000 /home/hmontoliu/.bash_history
Run Code Online (Sandbox Code Playgroud)

如果你觉得这很烦人,你可以等于 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
Run Code Online (Sandbox Code Playgroud)

最后的提示:您应该运行help history以查看可以对历史记录执行的操作


Cal*_*leb 5

hmontoliu 的答案非常好,这只是一个 TL;DR 版本。

bash 历史记录总是会从您上次停下的地方继续。它在您的主目录中的文件中保留运行命令的半永久历史记录。每次启动 bash shell 时,它都会加载此历史文件,并且您可以向上滚动到之前会话中运行的命令。如果历史记录中有 274 个以前的命令,则新 shell 上的命令历史记录编号将从 275 开始。

历史文件被截断为环境变量指定的最大长度$HISTFILESIZE。显然,它已将历史文件截断为最多 500 行,因此每个新 shell 都从 501 开始。以前的历史记录项是以前 shell 中最后 500 项的集合。