【问题标题】:Custom completion in shellshell中的自定义完成
【发布时间】:2015-12-02 03:25:56
【问题描述】:

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

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

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

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

$ 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 正在运行。

我不知道该怎么做。

【问题讨论】:

  • 在 bash 中不按 tab 只完成文件名吗?是否还有其他专门用于命令行补全的 bash 命令?
  • @JerryJeremiah bash 有一个完整的自定义完成框架——如果 OP 确认他正在使用 bash,我可以发布一些相关信息的答案。在您的系统上查看 /etc/completion.d 或 /etc/bash_completion.d(但并非所有系统都默认提供)
  • 谷歌自定义 bash 完成。 Here is a question with answers from SuperUser
  • 亲爱的!!!!我的问题是我需要一个解决方案,以便在二进制名称 之后,如果指定了选项 并按下了,那么应该调用一个名为help(g) 的函数。这将显示可用的组选项(来自数据库的查询),然后用户选择其中一个,他也将继续输入另一个选项。(没有程序退出)
  • 我不会依赖你的程序而不是 shell 来完成。问题是您需要在按下 [Tab] 时让 shell 运行程序,我怀疑这会以任何方式解决 - 因为这是您无法使用 shell 修改(afaik)的东西。但是,您可以使用 ./binary_name 使程序运行,然后创建自己的提示,然后可以收听 [Tab] 并提供补全。

标签: c linux bash tab-completion


【解决方案1】:

正如许多评论家所指出的,制表符补全是在 shell 中实现的,而不是在即将执行的程序中。

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

【讨论】:

    猜你喜欢
    • 2012-06-12
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多