【问题标题】:Bash programmable completion when typing "first command"键入“第一个命令”时的 Bash 可编程完成
【发布时间】:2012-05-04 13:56:34
【问题描述】:

有没有办法控制在 bash4 命令提示符上键入的第一个命令的完成?

我可以用完整的 -E 控制“空行”的完成,但是一旦键入一些字符,bash(或可能是 readline)就会给我来自 PATH 的所有文件名,内置命令(如果,那么,否则... ) 和完成尝试时的函数 (TAB)。

我能够通过在 PROMPT_COMMAND 中取消设置 PATH 并通过绑定函数以捕获 DEBUG 来恢复它来避免 PATH 条目,但没有运气摆脱 bash bultin 命令完成。

有什么想法吗?

【问题讨论】:

  • 抱歉,不是编程问题,投票转至superuser.com R 您可以“标记”它并要求主持人转至 i。 (我没有否决你的问题)。祝你好运。
  • 这不是编程问题吗?它绝对与编程相关,也许我应该更清楚地描述我的问题。它与stackoverflow.com/questions/4726695/… 密切相关。我正在为 bash4 中的集成框架开发 CLI,需要控制 bash4 完成以过滤不需要的建议。
  • 在我看来,这是关于使用编辑器,它直接放入 superuser.com。您很可能会在 S.O. 上得到回复。无论如何,祝你好运!
  • Bump;) 周围有没有 bash4 可编程完成黑客可以帮助我解决这个问题?我觉得很奇怪我可以控制空白行的完成,但是一旦我开始输入字符,那些“空白行”完成就会丢失......

标签: bash command bash-completion


【解决方案1】:

这是 bash 的可编程完成设施设计中的一个名副其实的弱点。即使是“默认”命令完成 -D 也仅对空行上的命令生效(前提是未指定 complete -E)。 complete -I 之类的东西(用于不完整输入的命令)丢失了。

【讨论】:

    【解决方案2】:

    截至Bash 5.0,bash 内置complete 支持-I 选项:

    -I 选项表示其他提供的选项和操作应该 适用于在该行的初始非分配词上完成,或 在命令分隔符之后,例如“;”或“|”,通常是命令 名称完成。

    我能够毫无问题地在 ubuntu docker 映像上 download and install bash 5.1 并使用它来模拟工具环境 shell。重击 5 should mostly be a drop-in replacement.

    【讨论】:

      【解决方案3】:

      bash 补全存储在 /etc/bash_completion.d/ 如果您有 root 访问权限,那么您可以在那里编辑/删除文件。

      如果您想在用户级别控制事物,那么您可以创建和编辑 ~/.inputrc。看看 /etc/inputrc,它会让你知道从哪里开始。

      ~/.inputrc 覆盖 /etc/inputrc 中的任何内容,因此您可以更改 bash_completion 查找完成文件的位置。您可以创建一个本地完成目录,并且只在其中包含您想要完成的项目。我相信您也可以消除 bash 内置函数。

      还有一些关于 bash 在线补全的非常好的教程。 Here Here

      【讨论】:

      • 他专门询问如何控制命令行上first单词的完成。
      • 这就是我所说的。他想设置一个受控环境,限制对标签扩展的访问。我回答了这个问题。这是引用“并且需要控制 bash4 完成以过滤不需要的建议”
      • 问题是似乎没有控制 first 词扩展的机制。您可以使用 'complete -E' 为一个完全空的行设置完成;否则,补全基于完成的第一个单词。
      • 很抱歉把它拖出来,但这只是部分正确。如果我有一个空的命令行并输入 b - 完成的第一件事是 'bluetooth-agent',它位于我的路径中的 '/usr/bin' 中。现在,假设 OP 将用户的路径限制为仅包含他希望用户运行的链接或文件的目录。然后,FIRST 单词将按照他的要求完成。除非我误解了这个问题。如果我这样做,请纠正我。我认为 bash -r 或 chroot jail 应该完成其中任何一个。
      • 如果您阅读他的问题,他已经清除了他的 PATH 以避免完成此类命令。他正在寻找的一件事是如何避免同时完成 bash 内置函数。
      猜你喜欢
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多