在 bash 脚本中,我正在读取一些用户输入read
。现在我想提供通过按键自动完成输入的可能性Tab。
简单的示例:假设用户应输入来自有限域的名称。在脚本中,我有一个包含所有有效名称的数组,这些名称应包含在自动完成建议中。
我已经尝试过一些具有可编程完成功能的东西,但我希望脚本是可移植的,即一切都应该是在这个脚本。类似的东西是 mysql - 如果你输入SELECT * FROM
并点击Tab它会显示数据库中的所有可用表(实际上是所有列)。
应该可以在 Mac OS X 上运行。
答案1
使用回卷,一个 readline 包装器。
从man rlwrap
rlwrap 运行指定的命令,拦截用户输入,以提供 readline 的行编辑、持久历史记录和完成功能。
以及 Debianrlwrap
软件包描述:
该软件包提供了一个小实用程序,它使用 GNU readline 库来允许编辑任何其他命令的键盘输入。输入历史记录会在调用过程中被记住,对于每个命令都是单独的;历史补全和搜索工作与 bash 中一样,并且可以在命令行上指定补全单词列表。
一个非常简单的示例脚本:
#! /bin/bash
ynm=(Yes No Maybe)
reply=$(rlwrap -S 'Do you want to continue? ' -H ~/.jakob.history
-e '' -i -f <(echo "${ynm[@]}") -o cat)
echo "reply='$reply'"
这使用 的rlwrap
一次性模式来运行cat
(以获取标准输入),但仅接受一行输入。 -o cat
是rlwrap
的推荐替代品read
。
命令行历史记录存储在 中~/.jakob.history
,完成项存储在 bash 数组中$ynm
。
rlwrap
需要一个文件作为选项的参数-f
。幸运的是,我们可以使用进程替换<(echo "${ynm[@]}")
来提供数组而不是文件。
-i
启用完成时不区分大小写。
成功完成后停止-e ''
追加rlwrap
空格(以便$reply
最终包含,例如,'Maybe'
而不是'Maybe '
尾随空格)
如果您希望在输入行上预先输入默认值,则可以使用-P
或--pre-given
选项 - 例如添加-P Yes
到rlwrap
上面示例脚本中的命令。用户只需点击Enter接受或退格键或Ctrl-即可删除默认值(这在 emacs 模式下U是正常的)。readline
请参阅man rlwrap
了解详细信息和更多选项。例如,您可以使用-c
或启用文件名完成--complete-filenames
。
在下载和编译源代码之前,检查是否rlwrap
为您的发行版打包(至少适用于 Debian,可能至少适用于 Ubuntu/Mint/etc)。