我输入了一堆命令,当我运行时,history
我发现它们不在那里。
除了命令以(空格)开头的情况之外,命令不会记录在历史记录中的情况是什么?
答案1
您已经提到了前导空格,另一个答案提到了将故意地更改历史记录中保存的内容,例如HISTIGNORE
设置,然后简单地关闭历史记录。
另一种情况是同一用户运行多个交互式 shell。 Z shell 有一个share_history
选项,可以让多个 Z shell 实例更新共享历史文件。它重新读取文件以查找新条目,并将时间戳应用于每个条目。
Bourne Again shell 没有这个内置功能(尽管可以有点执行此操作时,请使用 shenanighans 在打印提示时执行命令)。这改变的默认历史文件行为是,两个 shell 都不期望除自身之外的任何内容写入历史文件,并且在执行每个命令行后不会更新历史记录。
具体来说,Bourne Again shell 中的默认行为仅在 shell 退出或使用命令明确指示时更新历史文件history
。这不仅意味着当用户有多个交互式 shell 会话时,一个 shell 会简单地覆盖另一个 shell 写入的历史记录;而且而且 shell 也可能没有终止干净地不写出历史文件,从而丢失 shell 不正常终止和历史文件的最后(显式)更新之间发生的任何命令历史记录。
进一步阅读
答案2
历史记录主要由 shell 参数控制。
组织控制
HISTCONTROL
是这些参数之一。
内容如下man bash
:
HISTCONTROL
A colon-separated list of values controlling how commands are
saved on the history list. If the list of values includes
ignorespace, lines which begin with a space character are not
saved in the history list. A value of ignoredups causes lines
matching the previous history entry to not be saved. A value
of ignoreboth is shorthand for ignorespace and ignoredups. A
value of erasedups causes all previous lines matching the cur‐
rent line to be removed from the history list before that line
is saved. Any value not in the above list is ignored. If
HISTCONTROL is unset, or does not include a valid value, all
lines read by the shell parser are saved on the history list,
subject to the value of HISTIGNORE. The second and subsequent
lines of a multi-line compound command are not tested, and are
added to the history regardless of the value of HISTCONTROL.
键入echo $HISTCONTROL
以查看它是如何为您设置的。
- 被忽略- 忽略彼此跟随的相同命令
- 忽略空间- 正如你所说,忽略以空格开头的命令
- 忽略两者- 以上两者
- 已擦除- 再次使用旧命令时将其删除
我的猜测是您已erasedups
启用但命令丢失,因为它们已在稍后重用。
希斯蒂尼奥
也可以完全禁止某些命令或模式出现在历史记录中。
输入echo $HISTIGNORE
以查看哪些内容被禁止。模式列表由冒号分隔:
。也可以禁止一种模式,例如history*
禁止所有以历史一词开头的命令。
伤残史
还有历史仍然可以禁用。
如果这些情况都不适合您,您可以通过添加历史记录中未完全保留的命令序列来澄清您的问题。