Полные файлы из другого каталога в bash

Полные файлы из другого каталога в bash

Я написал две функции pushи pullдля копирования файлов в каталог и из него ( $FILE_EXCHANGE_DIR). Я хочу, чтобы bash автоматически дополнял имена из этого каталога, когда я использую pullфункцию. Я хочу, чтобы автодополнение брало только имена из указанного каталога. В текущей форме мое автодополнение также находит имена файлов в текущем каталоге, независимо от того, было ли совпадение в исходном каталоге ( $FILE_EXCHANGE_DIR) или нет.

Вот две версии функции, которые я передал complete. Ни одна из них не сработала.

_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;
}

В конце концов, я делаю

complete -f -F _pull pull

Есть ли хороший способ дополнять имена только из одного каталога (не текущего) и не из текущего? Даже в случае, если в источнике не было совпадений (который должен по умолчанию дополняться readlineпо умолчанию?

решение1

Если я правильно понимаю, это то, что вы ищете:

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

Он даже экранирует пробелы в именах файлов.

Обратите внимание, что это -o defaultзавершается readlineзначением по умолчанию, но это, похоже, на самом деле ничего не значит, если вы не зададите это явно где-то ( .initrc?). Если вам нужны имена файлов, используйте -o filenamesили придерживайтесь -f.

Связанный контент