bash で別のディレクトリからファイルを完了する

bash で別のディレクトリからファイルを完了する

ディレクトリ ( ) との間でファイルをコピーするための2 つの関数pushとを作成しました。関数を使用するときに、bash にそのディレクトリの名前を自動補完させたいです。自動補完では、指定されたディレクトリの名前のみを取得するようにしたいです。現在の形式では、ソース ディレクトリ ( ) に一致があるかどうかに関係なく、自動補完によって現在のディレクトリ内のファイルの名前も検索されます。pull$FILE_EXCHANGE_DIRpull$FILE_EXCHANGE_DIR

に渡した関数の 2 つのバージョンを以下に示します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

現在のディレクトリではなく、1 つのディレクトリ (現在のディレクトリではない) からのみ名前を補完する良い方法はありますか? ソースに一致するものがない場合でも (デフォルトの補完が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

関連情報