compgen -W "${all_commands}" -- "${cur}"
corre compgen
, passando:
- a opção
-W
com um argumento, o valor da variávelall_commands
; - um argumento não opcional, o valor da variável
cur
.
O argumento --
marca o final das opções. Mesmo se o valor de cur
começar com um traço, ele não será interpretado como uma opção. Esta é uma convenção extremamente comum para a análise de opções de linha de comando.
${COMPREPLY[@]:-}
é estranho. Ele usa o constructo de expansão de parâmetro ${VARIABLE:-TEXT}
, que se expande para o valor de VARIABLE
se definido e não vazio e para TEXT
caso contrário, de uma maneira totalmente sem sentido. Ele pega os elementos da matriz COMPREPLY
, exceto que se a matriz estiver vazia ou indefinida, resultará em uma string vazia. Então o resultado é dividido em palavras e cada palavra é interpretada como um padrão glob . Isso é exatamente equivalente a ${COMPREPLY[@]}
, exceto quando COMPREPLY
não está definido e set -u
está em vigor: em set -u
, ${COMPREPLY[@]}
acionaria um erro se COMPREPLY
não estivesse definido. Observe, em particular, que essa instrução não é anexada à matriz COMPREPLY
, ela a manipula. Para acrescentar ao array, o código correto seria
COMPREPLY+=($(compgen -W "${all_commands}" -- "${cur}") )
assumindo que a saída de compgen
contenha uma lista de padrões globais delimitada por espaços em branco.