在 shell 中自定义完成

标签 c linux bash tab-completion

我需要开发一个实用程序,它将采用如下命令行参数:

$ lsm  -g <group> -t <type> -d <device>

我的项目经理希望当我们键入任何参数,如 lsm -g 并按下 Tab 时,将调用一个函数来运行数据库查询并获取帮助用户了解选项的值(value)。

类似于终端在这种情况下的行为:

$ cd <tab>
.bash_history                   .local/
.bash_logout                    .log-report.log.swp
.bash_profile                   .macromedia/
.bashrc                         .mozilla/
.cache/                         Music/
.config/                        .mysql_history
.dbus/                          .nautilus/
Desktop/                        .opera/
Documents/                      .orc/
Downloads/                      .p2/
.eclipse/                       Pictures/

我尝试过这些方法:

  1. 使用fork()创建子调用帮助函数。
  2. 使用 execv() 使用单独的二进制文件运行帮助函数。

但两者都需要运行 lsm

我不确定如何进一步进行。

最佳答案

正如各种评论员所指出的,tab 完成是在 shell 中实现的,而不是在将要执行的程序中实现的。

大多数 shell 都有用于实现自定义制表符补全的框架。对于 bash,它是在 readline 库的帮助下实现的。 bash manual 中有大量文档互联网上有各种各样的教程,例如 this one from Debian (不是背书,只是快速 Google 搜索的结果)。

关于在 shell 中自定义完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34034374/

相关文章:

c - 将文件封装在未压缩的 ZIP 文件中的简单库?

c - 在 Linux 中从/bin/启动 C 应用程序时获取当前路径

c - 为什么不同的节点运行我的可执行文件的不同编译? (初级产业部)

bash - 如何运行 bash 脚本?

linux - 从已编译库的反汇编中仅获取十六进制字节值

c - 如何将包含已分配内存的结构保存到文件?

C 循环优化

c - 如何找到损坏的sqlite3数据库?

linux - 将并发客户端桥接到单个连接的代理

mysql - 通过 debconf-set-selections 为 mysql 预配置一个空密码