ZSH - 输出整个历史?

Nat*_*ong 76 zsh

我最近从 bash 切换到 zsh。在 bash 中,我用来查找以前运行的命令的一种方法(除了递归搜索)是history | grep whateverwhatever我记得的命令位在哪里。

在 zsh 中,这不起作用。history尽管我的.zsh_history文件包含许多条目,但我已将其配置为执行此操作,但仅返回少数项目。

如何输出我的整个历史,适合搜索grep

Kyl*_*ndt 107

History 接受 zsh 条目中的一个范围作为[first] [last]参数,因此要让它们全部运行history 0

要获得 zsh 帮助(至少记住)Alt-h,请在 history 命令上键入,这将显示内置帮助。

  • 这并不重要,但历史列表从 1 而不是 0 开始。 (11认同)
  • 到`历史1 | grep` 人,我希望你知道 `ctrl+r` - 有史以来最好的技巧/捷径! (11认同)
  • 伟大的!不过,这对我来说是一个令人讨厌的默认设置,所以我将它添加到我的别名文件中:`alias history="history 0"` (8认同)
  • 我自己使用这个别名:`alias h='history 1 | grep'` (7认同)
  • 这似乎对我不起作用:我的 `~/.zsh_history` 有 10066 行,但 `history 0`(或等效的 `fc -l 0`)只打印出 4999 行。 (4认同)
  • 如何获取“history”命令手册?我在 Mac 上,“man History”显示 BSD 内置命令 (2认同)

wjv*_*wjv 26

接受的答案是正确的,但值得注意的是,您不需要调用外部grep二进制文件来进行搜索,因为该功能已内置。我在我的.zshrc.

histsearch() { fc -lim "*$@*" 1 }
Run Code Online (Sandbox Code Playgroud)

笔记:

  • fc是控制交互历史的 zsh 内置函数。 history相当于fc -l

  • -m标志需要一个模式,该模式必须被引用。

  • -i标志添加了时间戳。

  • fc还有更多的技巧(例如,将搜索限制为当前会话的内部历史记录)。请参阅zshbuiltins(1)手册页或官方文档

编辑 (2021-01-27):

使用此方法比仅对 zsh 历史文件进行 grep 的主要优点是您可以通过-i. 当然,这仅在您首先启用将时间戳保存到历史文件时才有效:

setopt EXTENDED_HISTORY
Run Code Online (Sandbox Code Playgroud)

多年来,我还在-D我的函数中添加了标志,它显示了历史命令的运行时间。(这又依赖于EXTENDED_HISTORY。)另外,我已将函数重命名为hgrep,我发现它更容易记住:

hgrep () { fc -Dlim "*$@*” 1 }
Run Code Online (Sandbox Code Playgroud)

  • 更好的是使用“\*$@\*”(注意额外的星号)模式而不是“$@”,因为后者仅产生完全匹配。 (3认同)
  • 你完全正确,@PiotrDobrogost!我不确定我是如何在我所做的状态下提交这个答案的——我猜我一定是凭记忆输入了这个函数。就目前而言,它不是很有用,所以我将编辑答案以合并星号。 (2认同)

Dan*_*ath 5

看看fzf。它不仅有助于在您的 shell 历史记录中找到“任何粒子”,还有助于在其他有趣的地方,例如浏览器历史记录、目录历史记录等。

fzf 是一个命令行模糊查找器。这意味着您可以搜索您正在寻找的粒子或部分,它会显示您可以不断优化的匹配集合。这真的是一个游戏规则改变者。

作者的主页包含许多说明性示例。