Como escrever um preenchimento bash para completar os nomes dos diretores a partir de ~ /

1

Imagine que eu tenha um script bash chamado myscript , que será apenas echo do primeiro argumento, que será um nome de diretório.
Exemplo de uso:
myscript proj1
Onde proj1 é um diretório, por exemplo, localizado em ~/folder1/folder2/proj1 e seu diretório de trabalho atual é ~/ .
Minha pergunta é, para este script, como eu poderia escrever uma regra de conclusão para que myscript [tab][tab] listasse todos os diretórios disponíveis para echo , começando em ~/ . Isso significa que, no primeiro exemplo, e supondo que esses são os únicos diretórios em ~/ , myscript pro[tab] completaria a expressão para myscript proj1 .
Alguém pode me ajudar a conseguir isso?

Obrigado antecipadamente.

    
por rjj 19.03.2015 / 21:40

1 resposta

3

Sua descrição parece estranha: se você obtiver apenas proj1 , como você sabe qual é o diretório pai dele?

De qualquer forma, para dar o que você pediu:

# for me, this takes a looooooong time [1]. Do it once and cache it
mapfile -t _all_dir_names < <( find ~ -type d -printf "%f\n" )

# the function you want completion for
myfunc () { echo hello world $*; }

# the completion function
complete_myfunc() {
    local dir cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=()
    for dir in "${_all_dir_names[@]}"; do
        if [[ $dir == "$cur"* ]]; then
            printf -v dir "%q" "$dir"      # protect whitespace in the dir name
            COMPREPLY+=("$dir")
        fi
    done
}

# registering the completion
complete -F complete_myfunc myfunc

[1]: 2 minutos, 66782 diretórios

    
por glenn jackman 19.03.2015 / 23:03