Como especificar o prefixo do protocolo contendo “:” para a função de conclusão do bash _known_hosts_real

2

Estou tentando usar o bash-completion para URLs do formulário "proto: // host". Sem o ":", vejo o comportamento esperado, com o ":" presente, a URL sai "defeituosa".

A conclusão do bash tem uma função para nomes de host, _known_hosts_real . Tem um parâmetro -p PREFIX que eu quero usar.

Como reproduzir um comportamento "errado":

Você precisa de pelo menos um host "conhecido" no seu sistema:

Por exemplo echo "gdns.google 8.8.8.8" >> /etc/hosts

Execute estes comandos para exemplos funcionais:

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

Exemplo não funcional:

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

Observe que a única diferença é o cólon adicionado em "http: //". O problema aqui é que o prefixo perdeu o especificador de protocolo e os dois pontos. Esse comportamento é esperado?

    
por Alex Stragies 06.07.2016 / 23:48

2 respostas

1

@Michael_Veers apontou que esse é o comportamento esperado (+1), então eu deveria escrever minha própria função.

Mas, em vez disso, escrevi um patch para o padrão _known_hosts_real no meu bashrc, que ativa opções adicionais:

  • -t Não aparar no cólon esquerdo
  • -S <suffix> Adicionar sufixo personalizado

Em .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 ]||/')

Agora, isso funciona como esperado:

$ unset COMPREPLY
$ _known_hosts_real -p "scp://" -S '/' -t -a gdn
$ echo $COMPREPLY
scp://gdns.google/
    
por 07.07.2016 / 19:35
1

É o comportamento esperado, como _known_hosts_real chamadas __ltrim_colon_completions , que remove os prefixos terminados por dois pontos. _known_hosts_real é destinado ao uso com o arquivo de hosts conhecidos ssh , portanto, você provavelmente deve definir sua própria função com base em compgen -A hostname .

    
por 07.07.2016 / 11:35