我有两个单独的脚本,在不同的路径中使用相同的文件名,用于不同的项目:
/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的解决方案不感兴趣,或者需要第三个组件知道其中任何一个的解决方案 - 在我的情况下会破坏目的。
答案 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 完成配置。
这个概念很有魅力。
注意:我将很快更新此答案并提供一些源代码。