Bash 历史记录编号不从 1 开始?

Bash 历史记录编号不从 1 开始?

当我遇到一些奇怪的事情时,我正在自定义 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”。

相关内容