compgen -W "${all_commands}" -- "${cur}" corre compgen , passando:
- a opção
-Wcom 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.