对于碰巧共享相同名称的单独命令,是否可以使用单独的bash完成功能?

时间:2017-05-29 02:11:30

标签: bash completion

我有两个单独的脚本,在不同的路径中使用相同的文件名,用于不同的项目: /home/me/projects/alpha/bin/hithere/home/me/projects/beta/bin/hithere

相应地,我有两个单独的bash完成脚本,因为每个脚本的正确完成都不同。在完成脚本中,为每个完成运行“完整”命令,指定相关脚本的全名,即

complete -F _alpha_hithere_completion /home/me/projects/alpha/bin/hithere

但是,只有最近运行的脚本似乎有效,无论调用hithere的实际版本是什么:似乎bash完成只关心命令的文件名并忽略路径信息

有没有办法改变这种行为,以便我可以拥有这两个具有相同名称的独立脚本,每个脚本都有不同的完成函数?

请注意,我对一个需要alpha知道beta的解决方案不感兴趣,或者需要第三个组件知道其中任何一个的解决方案 - 在我的情况下会破坏目的。

2 个答案:

答案 0 :(得分:1)

Bash manual描述了完成的查找过程:

  

如果命令字是完整路径名,则首先搜索完整路径名的compspec。如果没有找到完整路径名的compspec,则尝试查找最终斜杠后面的部分的compspec。如果这些搜索不会导致compspec,则使用-D complete选项定义的任何compspec都将作为默认值。

因此complete使用完整路径 ,但前提是您通过其完整路径调用命令。至于使用短名称来完成工作,我认为你唯一的选择(从规范判断)将是某种动态钩子,它决定了基于$PWD调用哪个完成函数 - 我不知道没有任何证据表明Bash支持像你想象的那样重载完整名称。

答案 1 :(得分:0)

是的,这是可能的。但这有点棘手。我将其用于我正在开发的未来脚本概念:所有脚本与构建脚本同名,但 bash 补全仍然可以完成它的工作。

为此,我使用了一个两步过程:首先,我在 ~/.config/bash_completion.d 中放置了一个主脚本。此脚本旨在涵盖特定共享脚本名称的所有脚本。我配置了 ~/.bashrc 以便为这些脚本加载 bash 完成文件。

该脚本将获取我想要 bash 完成的特定脚本文件的完整文件路径。从这个路径我生成一个标识符。对于此标识符,存在一个提供实际 bash 完成数据的文件。因此,如果执行 bash 完成,主 bash 完成脚本中的 bash 完成功能将检查该文件并加载其内容。然后它将继续常规的 bash 完成操作。

如果您有两个同名的脚本,您将拥有两个不同的标识符,因为这些脚本共享相同的名称但具有不同的路径。因此可以使用两种不同的 bash 完成配置。

这个概念很有魅力。


注意:我将很快更新此答案并提供一些源代码。