3

对于不同的项目,我有两个具有相同文件名、不同路径的单独脚本: /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 或需要第三个组件了解它们中的任何一个的解决方案不感兴趣——这将违背我的目的。

4

2 回答 2

2

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

如果命令词是完整路径名,则首先搜索完整路径名的 compspec。如果未找到完整路径名的 compspec,则尝试为最后一个斜杠后面的部分查找 compspec。如果这些搜索未产生 compspec,则使用-D选项 to定义的任何 compspec 将complete用作默认值。

因此,完整路径使用complete,但前提是您通过其完整路径调用命令。至于仅使用短名称来完成工作,我认为您唯一的选择(从规范来看)将是某种动态钩子,它根据$PWD- 我没有看到任何证据来确定要调用的完成函数Bash 支持像您设想的那样重载完成名称。

于 2017-06-01T21:31:13.613 回答
0

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

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

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

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

这个概念就像一个魅力。


注意:我会尽快更新这个答案,提供一些源代码。

于 2021-03-11T19:51:03.347 回答