Porque você usou compgen -f
, significando que compgen
listará todos os arquivos e diretórios no caminho atual. No seu caso, isso significa 0A6F010B 0A6F010C 0A6F010D 0A6F010E
.
Para obter nomes de host, você pode percorrer o caminho atual, alimentar cada IP para getnameinfo
para obter o nome de host correspondente a esse IP, salvá-lo em uma matriz e usar essa matriz como uma lista de palavras com compgen -W
. / p>
Eu fiz um teste simples no meu ambiente. Eu criei um arquivo /etc/bash_completion.d/cuonglm
:
_rmpxe() {
local word
COMPREPLY=()
if [ 1 -eq "$COMP_CWORD" ]; then
pushd /home/cuonglm/test &>/dev/null || return 1
word="${COMP_WORDS[COMP_CWORD]}"
HOST_ARR=()
for i in *; do
HOST_ARR+=($(/home/cuonglm/getnameinfo "$i"))
done
COMPREPLY=($(compgen -W "$(printf "%s " "${HOST_ARR[@]}")" -- "$word"))
popd &>/dev/null
fi
}
complete -F _rmpxe cuonglm
Eu usei sua função completa com uma pequena modificação:
- Eu uso uma matriz
HOST_ARR
para salvar nomes de host. - Faz um loop pelo diretório atual (obrigado
pushd
antes), alimentando cada nome de arquivo paragetnameinfo
program. - Então eu uso o
compgen -W
para fazer o compgen criar uma lista de palavras para a conclusão.
E aqui está o resultado:
$ cuonglm <Tab>
$ cuonglm server<Tab>
server1.example.com server2.example.com
Como dois nomes de host têm a mesma parte server
, o bash completará automaticamente essa parte primeiro. Se houver outro nome de host, Server.example
:
$ cuonglm <Tab>
Server.example server1.example.com server2.example.com