bash의 다른 디렉토리에 있는 전체 파일

bash의 다른 디렉토리에 있는 전체 파일

나는 파일을 디렉토리( )에 복사하고 디렉토리에서 파일을 복사하는 push두 가지 함수를 작성했습니다 . 이 기능을 사용할 때 bash가 해당 디렉토리의 이름을 자동 완성하기 를 원합니다 . 자동 완성 기능이 해당 디렉토리에서만 이름을 가져오길 원합니다. 현재 양식에서 자동 완성 기능은 소스 디렉터리( )에 일치하는 항목이 있는지 여부 에 관계없이 현재 디렉터리에서 파일 이름도 찾습니다 .pull$FILE_EXCHANGE_DIRpull$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.

관련 정보