自定义文件中的 Ctrl-R 风格交互式搜索

自定义文件中的 Ctrl-R 风格交互式搜索

我希望能够搜索自定义文本文件,类似于 bash 中的交互式历史搜索。

一旦找到想要的条目,就执行该行。

奖励积分:每条记录包含两个字段 - 搜索目标和将执行的命令

我试图通过此实现的目的是允许从服务器列表中快速自动完成服务器名称。

答案1

您可以使用以下命令将自定义文件加载到 Bash 历史记录本身中history命令history -r将读取您指定的文件作为命令历史记录,或者指定的文件HISTFILE如果你不说出其中一个:

history -r ~/custom

此后,您可以使用任何普通操作来访问包含自定义文件中的数据的历史记录,包括Ctrl-R历史!记录扩展等。

如果您只想暂时启用此功能,您可以保存当前历史记录,读取自定义文件,然后在最后读取普通文件:

$ history -w # Or -a if you prefer
$ history -r ~/custom
...
$ history -cr

history -cr将清除内存中的历史记录并从标准历史记录文件中重新读取它$HISTFILE。您还可以创建别名来缩短此过程。

或者,您可以使用以下方法将计算值添加到历史记录中history -s。以下相当于仅读取文件:

while read command
do
    history -s "$command"
done < ~/custom

您可以通过这种方式添加任意数量的任意历史记录条目,并根据您拥有的任何可用数据进行计算(例如,读取服务器名称和端口的列表并使用history -s "ssh -p $port $servername")。这在函数中效果很好。写入、清除和恢复历史记录的相同选项也适用于此。

作为最后一个选项,如果您HISTFILE在启动时在环境中进行设置bash,那么它将将该文件视为您的历史记录。您可以从脚本启动一个新的 shell,并HISTFILE适当设置让用户选择命令:HISTFILE=~/custom bash。通过仔细构建,您可以使该 shell 在运行所选命令后立即终止。


走出 Bash 本身,rlwrap是一个包装 Readline 中任何其他命令行工具的工具rlwrap -H ~/custom cmd...将使用给定的历史文件运行命令。您可以构建该程序来完全执行您想要的操作,包括仅选择带有用户输入的服务器名称,然后构建命令。

相关内容