bashの別のディレクトリにあるファイル全体

bashの別のディレクトリにあるファイル全体

私はファイルをディレクトリ()にコピーし、ディレクトリからファイルをコピーするpush2つの関数を作成しました。この機能を使用するとき、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

現在のディレクトリではなく、ディレクトリ(現在のディレクトリではない)からのみ名前を完成させるための良い方法はありますか?これはソースに一致するものがない場合でもデフォルトで行う必要がありますか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

おすすめ記事