É o trabalho do comando -C descobrir qual texto inserir em resposta a uma solicitação de conclusão. A interface é um pouco estranha:
-
O argumento para
-Cé interpretado como um trecho de script bash. O Bash anexa três strings com aspas corretamente a este snippet:- o comando cujos argumentos estão sendo concluídos;
- o prefixo da palavra onde o cursor está, até o cursor;
- a palavra antes do cursor.
-
Algumas variáveis são adicionadas ao ambiente:
-
COMP_LINEcontém a linha completa na qual a conclusão é executada. -
COMP_POINTcontém a posição do cursor dentro deCOMP_LINE(contando de 0) . -
COMP_TYPEé 9 para conclusão normal, 33 ao listar alternativas em conclusões ambíguas , 37 para conclusão do menu, 63 ao tabular entre conclusões ambíguas, 64 para listar conclusões após uma conclusão parcial. -
COMP_KEYcontém a chave que desencadeou a conclusão (por exemplo, um caractere de tabulação se o usuário pressionou a tecla Tab ).
-
- A saída do comando é interpretada como texto para substituir a palavra atual por. Note que este é um substituto, não um sufixo para acrescentar; o comando é suposto filtrar pelo prefixo dado. Pode conter várias linhas e, nesse caso, cada linha é considerada uma possível substituição.
Este é basicamente o mesmo mecanismo que é fornecido e melhor documentado , para funções com -F . As funções obtêm uma interface um pouco mais simples: elas podem ler a lista de palavras do comando atual no variável COMP_WORDS e a posição inicial da palavra atual em COMP_CWORD ; eles escrevem os resultados na matriz COMP_REPLY .
Como os argumentos úteis - em particular, o prefixo para completar - são passados no final do comando, -C é praticamente utilizável apenas com um comando externo. Claro que você pode usar algo como sh -c … , mas não será bonito.
complete -C 'sh -c '\'for x in one two three; do case $x in "$1"*) echo "$x";; esac''\'