如何为 bash-completion 函数 _known_hosts_real 指定包含“:”的协议前缀

如何为 bash-completion 函数 _known_hosts_real 指定包含“:”的协议前缀

我正在尝试对“proto://host”形式的 URL 使用 bash-completion。如果没有“:”,我会看到预期的行为,如果存在“:”,则 URL 会出现“错误”。

Bash 补全有一个主机名功能,_known_hosts_real.它有一个-p PREFIX我想使用的参数。

如何重现“错误”行为:

您的系统上至少需要一台“已知”主机:

例如echo "gdns.google 8.8.8.8" >> /etc/hosts

运行以下命令以获取功能示例:

$ unset COMPREPLY 
$ _known_hosts_real -p 'http//' -- "gdn"
$ echo $COMPREPLY 
http//gdns.google

非工作示例:

$ unset COMPREPLY 
$ _known_hosts_real -p 'http://' -- "gdn"
$ echo $COMPREPLY 
//gdns.google

请注意,唯一的区别是“http://”中添加的冒号。这里的问题是前缀丢失了协议说明符和冒号。这是预期的行为吗?

答案1

这是预期的行为,如_known_hosts_real调用__ltrim_colon_completions,它删除以冒号结尾的前缀。_known_hosts_real旨在与ssh已知的主机文件一起使用,因此您可能应该在compgen -A hostname.

答案2

@Michael_Veers 指出,这是预期的行为(+1),所以我应该编写自己的函数。

_known_hosts_real但相反,我在 bashrc 中编写了该标准的补丁,以启用其他选项:

  • -t不要修剪到左结肠
  • -S <suffix>添加自定义后缀

.bashrc

 . <(type _known_hosts_real | sed -e '
 1d;s/acF:p:/actS:F:p:/;
 s/^.*c)/\nS)\nsuffix=$OPTARG\n;;\nt)\nnotrim=1\n;;\nc)/;
 s/\(__lt\)/[ $notrim ]||\1/')

现在这按预期工作:

$ unset COMPREPLY
$ _known_hosts_real -p "scp://" -S '/' -t -a gdn
$ echo $COMPREPLY
scp://gdns.google/

相关内容