Zsh历史记录太短。

113
当我在Bash中运行history命令时,会得到大量结果(1000+)。但是当我在zsh shell中运行history命令时,我只能得到15个结果。这使得在zsh中使用grep历史记录几乎毫无用处。 我的.zshrc文件包含以下行:
HISTFILE=~/.zhistory
HISTSIZE=SAVEHIST=10000
setopt sharehistory
setopt extendedhistory

我该如何修复zsh,以使我的Shell历史记录更有用?


更新

如果在zsh中调用history 1,我会得到所有的历史记录,就像在Bash中使用history一样。 我可以给命令取一个别名来获得相同的结果,但我想知道为什么history在zsh和Bash中表现不同。


2
作为在历史记录中查找的替代方案,我强烈推荐使用fzf(https://github.com/junegunn/fzf)-它允许您在ctrl + r上对shell历史记录进行模糊搜索。 - David
3个回答

148
NVaughan(问题的提出者)在更新问题后已经给出了答案:historybashzsh中行为不同

简而言之:

  • zsh:
    • history仅列出最近的15个历史记录条目
    • history 1列出全部,见下文
  • bash:
    • history列出所有历史记录条目

不幸的是,将数字操作数传递给history时也有不同的行为:

  • zsh:
    • history <n>显示<n>开始的所有条目 - 因此history 1显示全部条目。
    • (history -<n> - 注意到-- 显示<n> 最近的条目,因此默认行为实际上是history -15)
  • bash:
    • history <n>显示<n> 最近的条目。
    • (bash的history不支持从条目编号开始列出;您可以使用fc -l <n>,但是必须存在一个特定的条目<n>,否则该命令将失败-见下文。)

可选的背景信息:

  • 在zsh中,history实际上是fc -l的有效别名(但不是真正的别名):请参阅man zshbuiltins
    • 有关许多历史相关功能,请参阅man zshall
  • 在bash中,history是其自己的命令,其语法与fc -l不同
    • 请参阅:man bash
  • bash和zsh都支持fc -l <fromNum> [<toNum>]以列出给定的历史记录条目范围:
    • bash:必须存在特定条目<fromNum>
    • zsh:只要至少有1个条目在(显式或隐式的)范围内,则命令将成功。
    • 因此,在zsh中,fc -l 1可以返回所有历史记录条目,而在bash中通常不会,因为通常不存在第1个条目(但是如上所述,您可以在bash中使用无参数的history列出所有条目)。

1
有没有办法更改zsh的“history”中默认输出行数?(除了明显的alias history="fc -l $NUMBER之外) - Dan Lenski
1
"Oh my zsh" 设置一个 shell 别名 history=omz_history,该别名列出了所有历史记录。 https://github.com/ohmyzsh/ohmyzsh/blob/53863e7b3ff0c2e2816e90dab3d870adebdf49c7/lib/history.zsh - Andrew

25
#set history size
export HISTSIZE=10000
#save history after logout
export SAVEHIST=10000
#history file
export HISTFILE=~/.zhistory
#append into history file
setopt INC_APPEND_HISTORY
#save only one command if 2 common are same and consistent
setopt HIST_IGNORE_DUPS
#add timestamp for each entry
setopt EXTENDED_HISTORY   

这是我的设置,它可以正常工作。


9
赞同有用的设置,但它没有回答问题(在zsh中,不带参数使用history命令只显示最近的15个条目,因此问题是一个“显示”问题)。 - mklement0
FYI:bck-i-search(在zsh中进行反向历史搜索)将搜索整个历史记录(>history 1)。 - paiego
你是如何在设置了EXTENDED_HISTORY选项后获取时间戳的? - Cassio Seffrin
在 Mac 上,您仍需要将 history 别名设置为 history 1。 - user1689987

13
也许有些晚了,但如果你看到这篇文章并尝试应用它,却失败了……那么实际上,把这段代码放在.zshrc文件中即可:
alias history='history 1'

直到 HIST_SIZE 用完之前,您才能看到所有内容。为了查找命令,我使用以下命令(在更改 .zshrc 后):

history | grep "my_grep_string"

5
更改命令的含义总是有些不稳定... 定义alias hist='history 1'可能更好,这样原来的history命令的含义就不会受到影响(以防有脚本等在使用它)。总的来说,我喜欢使用别名来方便生活的想法。 - Floris
是的,这对于我来说在 Mac 上是必需的。 - user1689987

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接