我正在尝试对“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/