Como você suspeita, o comando recebe algumas informações sobre o que completar. Isso está documentado no manual, mas não na documentação do complete
builtin , você precisa ler a seção introdutória sobre conclusão programável .
any shell function or command specified with the
-F
and-C
options is invoked. When the command or function is invoked, theCOMP_LINE
,COMP_POINT
,COMP_KEY
, andCOMP_TYPE
variables are assigned values as described above (see Bash Variables). If a shell function is being invoked, theCOMP_WORDS
andCOMP_CWORD
variables are also set. When the function or command is invoked, the first argument is the name of the command whose arguments are being completed, the second argument is the word being completed, and the third argument is the word preceding the word being completed on the current command line. No filtering of the generated completions against the word being completed is performed; the function or command has complete freedom in generating the matches.
Então o comando é chamado com três parâmetros:
- O nome do comando - para que você possa combinar conclusões para comandos semelhantes em um script.
- A palavra a ser completada - para que você possa limitar a saída ao prefixo que será filtrado de qualquer maneira.
- A palavra anterior - útil, por ex. para completar opções.
Os mesmos parâmetros são passados para as funções de conclusão ( complete -F somefunction
). Observe que, independentemente de você usar uma função ou um comando, é sua tarefa filtrar correspondências desejadas.
Com o que você tentou, o comando que acaba sendo executado é apt-cache --no-generate pkgnames mys '' mys
. Isso imprime uma lista de nomes de pacotes que começam com mys
( apt-cache pkgnames
apenas examina o primeiro operando). O prefixo comum mais longo é mys
, então o bash começa a completar mys
e espera que você selecione a próxima letra.
Dado que os argumentos são anexados ao comando (não passados como parâmetros posicionais - o argumento para -C
é analisado como um comando shell), não existe uma maneira fácil de analisá-los. A solução mais simples é usar uma função de wrapper.
_mys () {
COMPREPLY=$(apt-cache --no-generate pkgnames "$2")
}
complete -F _mys mys