Arquivos completos de um diretório diferente no bash

Arquivos completos de um diretório diferente no bash

Eu escrevi duas funções pushe pullpara copiar arquivos de e para um diretório ( $FILE_EXCHANGE_DIR). Quero que o bash preencha automaticamente os nomes desse diretório quando uso a pullfunção. Quero que o preenchimento automático receba apenas nomes do referido diretório. No formulário atual, meu preenchimento automático também encontra nomes dos arquivos no diretório atual, independentemente de haver correspondência no diretório de origem ( $FILE_EXCHANGE_DIR) ou não.

Aqui estão duas versões da função para a qual passei complete. Nenhum deles funcionou.

_pull () {
    local cmd="${1##*/}";
    local word=${COMP_WORDS[COMP_CWORD]};
    local line=${COMP_LINE};
    filelist=( $(ls ${FILE_EXCHANGE_DIR} ) )

    local TEMP_COMPREPLY=( $(compgen -W "${filelist[@]}" -- ${word} ) )

    COMPREPLY=( "${TEMP_COMPREPLY[@]}" )
    return 0;
}

_pull () 
{
    local word=${COMP_WORDS[COMP_CWORD]};
    local line=${COMP_LINE};
    local pat="$FILE_EXCHANGE_DIR/*"

    COMPREPLY=($(compgen -f -G "$pat" -- "$FILE_EXCHANGE_DIR/${word}"));

    i=0
    for item in "${COMPREPLY[@]}"; do
        COMPREPLY[$i]="${item##*/}"
        i+=1
    done;
    return 0;
}

No final, eu faço

complete -f -F _pull pull

Existe uma boa maneira de completar nomes apenas de um diretório (que não é o atual) e não do atual? Mesmo no caso em que não houve correspondência na fonte (que deve ser o padrão de readlineconclusão?

Responder1

Se bem entendi, deve ser isso que você está procurando:

_pull () {
    # Set
    IFS=$'\n' tmp=( $(compgen -W "$(ls "$FILE_EXCHANGE_DIR")" -- "${COMP_WORDS[$COMP_CWORD]}" ))
    COMPREPLY=( "${tmp[@]// /\ }" )
}
complete -o default -F _pull pull

Ele até escapa de espaços nos nomes dos arquivos.

Observe que isso -o defaulttermina com readlineo padrão, mas isso não parece ser nada, a menos que você o defina explicitamente em algum lugar ( .initrc?). Se você quiser nomes de arquivos, use -o filenamesou fique com -f.

informação relacionada