Bash 历史搜索,部分 + 向上箭头

TLP*_*TLP 192 command-line bash history bashrc

我已经搜索过,但没有找到任何关于此的内容。我正在使用终端在 bash 中寻找功能。

回到过去,我有一个用户在 debian 系统上,一个朋友为我设置了一个方便的历史搜索功能(我相信我当时使用了 tcsh),我将在其中输入上一个命令的开头,点击向上箭头,它会根据部分字符串进行搜索。

例如,如果我的历史是:

./script.pl
./script.pl arg1
cat output
cat output | grep yada
Run Code Online (Sandbox Code Playgroud)

然后我输入.,然后按向上箭头,它会显示我:./script.pl arg1。再按一次,它会显示./script.pl,等等。

非常像它会grep在 .bash_history 上执行。有没有办法获得这个功能?

les*_*ana 248

打开您的~/.inputrc并添加以下行:

## arrow up
"\e[A":history-search-backward
## arrow down
"\e[B":history-search-forward
Run Code Online (Sandbox Code Playgroud)

提示:如果您没有此文件,请在底部阅读如何在不丢失默认绑定的情况下创建它。

以 开头的行#是注释。我不记得什么是向后的,什么是向前的。试验它。也许你必须来回切换。

只需重新打开可能打开的终端窗口即可使新行为生效。


一点背景资料:

Bash 使用readline来处理提示。~/.inputrc是readline的配置文件。请注意,这也将在其他使用 readline 库的软件中生效,例如IPython

有关 readline 的更多信息,请阅读bash 手册。在那里您还可以找到更多与历史相关的 readline 命令

要获取箭头键的转义码,您可以执行以下操作:

  1. cat终端开始(只是cat,没有进一步的参数)。
  2. 在键盘上键入键,你会得到^[[A向上箭头和^[[B向下箭头之类的东西。
  3. 替换^[\e

有关更多信息^[\e参见此处:https : //unix.stackexchange.com/a/89817/380515


如果您还没有~/.inputrc文件,请复制默认设置,否则所有其他默认键绑定将被覆盖:

cp /etc/inputrc ~/.inputrc
Run Code Online (Sandbox Code Playgroud)

~/.inputrc以以下行开始您的文件

$include /etc/inputrc
Run Code Online (Sandbox Code Playgroud)

  • 要保留所有默认值,请添加 `$include /etc/inputrc`,最好在第一行。 (10认同)
  • 很好,但此解决方案禁用了 ctrl-left/ctrl-right 快捷方式。 (4认同)

小智 39

在 /etc/profile.d/ 中创建一个名为 setup_readline.sh 模式为 644 的文件,内容如下,登录并检查您的首选密钥:

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
Run Code Online (Sandbox Code Playgroud)

我认为这是最好的方法。大多数情况下,如果您使用配置管理系统,例如厨师、木偶等

系统配置仍然保持不变!

  • 奇怪的是 ~/inputrc 对我不起作用 - 但是将这些命令放入 .bash_profile 中。 (5认同)

小智 14

Ctrl + R会给你这种功能。开始输入部分命令,它会出现旧命令,您可以使用向上和向下箭头进行导航。

更多信息在这里

  • @TLP,重复点击`Ctrl+r` (5认同)
  • 感谢您的回复。是的,我试过了,但我觉得它有点......挑剔。它不允许我滚动以部分开头的命令,它只显示第一个。它还在整个命令中搜索字符,这有点无用。 (2认同)

小智 7

以下解决方案结合并扩展了上述一些方法:将以下行添加到您的~/.bash_aliases文件中(不需要~/.inputrc)以实现以下行为:

  1. 按 CTRL+UP 和 CTRL+DOWN 在历史记录中向上/向下移动(仅限具有相同前缀的条目)。这可以与仅通过向上和向下在完整历史记录中向上/向下移动的标准功能共存
  2. 按 CTRL+RIGHT 和 CTRL+LEFT 跳转到命令行中的下一个/上一个单词
bind '"\e[1;5A":history-search-backward'
bind '"\e[1;5B":history-search-forward'
bind '"\e[1;5C":forward-word'
bind '"\e[1;5D":backward-word'
Run Code Online (Sandbox Code Playgroud)

重新登录 shell(或运行source ./bash_aliases)以应用更改。


bca*_*ag2 6

要完成 lesmana 关于~/.inputrc我应该在 Trusty 14.04 下创建的答案,请验证/添加~/.bashrc(第一行已存在于 my 中~/.bashrc):

shopt -s histappend  
PROMPT_COMMAND='history -a'  
Run Code Online (Sandbox Code Playgroud)

这里已经用法语解释了。

  • 该命令基本上指示 bash 立即将命令追加到历史文件中,而不是等待会话结束。如果您打开了很多终端并且不想在其中丢失历史记录,那么它很有用,但在其他情况下则没有必要。https://www.digitalocean.com/community/tutorials/how-to-use-bash-history-commands-and-expansions-on-a-linux-vps (4认同)