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

tsh*_*ang 6 bash command-history

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

Mik*_*kel 9

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

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

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

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

简而言之,这里有一些其他建议,您可能会找到可行的替代方案:


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


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

如果输入太长,请将其设置为保存一些输入的功能,例如

hgrep() {
    history | grep "$@"
}
Run Code Online (Sandbox Code Playgroud)

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

例如ls Alt+ P, Alt+ P, Alt+P 将通过您的所有ls命令向后搜索。

另外,您只需按其他快捷方式,例如,如果你在最古老的命令,你可以从按下开关改变方向Alt+P紧迫Alt+ N。

通过将其放入您的/etc/inputrc或.inputrc为来设置它bash:

$if mode=emacs
"\ep": history-search-backward
"\en": history-search-forward
$endif
Run Code Online (Sandbox Code Playgroud)

这在您的.zshrcfor 中zsh:

bindkey -M emacs '^[p' history-beginning-search-backward
bindkey -M emacs '^[n' history-beginning-search-forward
Run Code Online (Sandbox Code Playgroud)

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


最后,您确定该命令正在进入历史记录吗?可能由于HISTCONTROL或HISTIGNORE设置而被忽略,或者由于HISTSIZE?