如何在不需要前后移动的情况下搜索整个 bash 历史记录?

如何在不需要前后移动的情况下搜索整个 bash 历史记录?

有时,当我CtrlR搜索命令历史记录时,我发现我没有找到我正在寻找的条目,即使我知道它在历史记录中。我认为这是因为我已经通过了该条目,迫使我使用另一个命令去另一个方向。是否有一个命令允许在到达末尾时通过循环(重新开始循环)来搜索整个历史记录?

答案1

您可以使用Alt+>返回到历史记录的末尾,然后再次搜索,但也许您知道这一点,但这不是您想要的。

不幸的是,我认为没有办法让它环绕。

man bash我在或中看不到任何有关它的信息man readline

我们可以尝试编写一个readline宏,但是没有变量告诉我们我们处于哪一条历史线。

除此之外,这里还有一些其他建议,您可能会找到可行的替代方案:


如果您的终端配置为发送Ctrl+ S, (例如通过运行stty stop undef),那么您只需按Ctrl+即可更改方向S


您可以使用history | grep <whatever>then type!<number from left column>来运行它。

如果打字太长,请使其成为节省一些打字的功能,例如

hgrep() {
    history | grep "$@"
}

设置history-search-backwardhistory-search-forward.它们可以更容易使用。

例如ls Alt+ P, Alt+PAlt+P 将向后搜索所有ls命令。

另外,您只需按另一个快捷键即可更改方向,例如,如果您处于最旧的命令,则可以从按Alt+切换P到按Alt+即可N

通过将其放入您的/etc/inputrc.inputrc forbash

$if mode=emacs
"\ep": history-search-backward
"\en": history-search-forward
$endif

这在你.zshrczsh中:

bindkey -M emacs '^[p' history-beginning-search-backward
bindkey -M emacs '^[n' history-beginning-search-forward

您甚至可以更进一步,让向上箭头执行此操作。


最后,您确定该命令正在被写入历史吗?也许由于HISTCONTROLHISTIGNORE设置而被忽略,或者由于HISTSIZE设置而被忽略,或者由于?

相关内容