나는 두 가지 함수를 작성했고 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


