매개변수 위치에 따른 Smart Bash 완성

매개변수 위치에 따른 Smart Bash 완성

기본적으로 scp를 둘러싼 래퍼인 간단한 bash 기능이 있습니다. 전화해서 이용하세요

copytomachine <Machine> <File>

간단한 자동 완성 설정이 있어서 입력할 때

copytomachine <TAB><TAB>

이는 사용 가능한 시스템 목록을 제공합니다. 현재 하드코딩된 시퀀스만 있으면 충분합니다.

내가 들어가면

copytomachine BUILD_SERVER <TAB><TAB>

디렉토리에 있는 파일 목록을 제공하고 해당 경로 등을 자동 완성할 수 있기를 원합니다. 그러나 첫 번째 매개변수(컴퓨터 이름)에 대해 이 파일 목록이 제공되는 것을 원하지 않습니다.

현재 완료 스크립트는 다음과 같습니다.

_machines_completions()
{
    local opts
    opts="BUILD_SERVER TEST_SERVER LOCAL_MACHINE"
    COMPREPLY=( $(compgen -W "${opts}" -- ${COMP_WORDS[COMP_CWORD]}) )
    return 0
}

매개변수 1에 정의된 컴퓨터 이름에 대해 탭 완성을 수행하고 매개변수 2에 있는 파일 이름에 대해 탭 완성을 수행할 수 있도록 이를 수정하는 방법을 알려주실 수 있는 분 계십니까?

답변1

COMP_CWORD단어 번호이므로 해당 값을 테스트할 수 있습니다 .

_machines_completions()
{
    local opts
    opts="BUILD_SERVER TEST_SERVER LOCAL_MACHINE"
    case $COMP_CWORD in
        1)
            COMPREPLY=( $(compgen -W "${opts}" -- "${COMP_WORDS[COMP_CWORD]}") )
            ;;
        2)
            COMPREPLY=( $(compgen -o default -- "${COMP_WORDS[COMP_CWORD]}") )
            ;;
    esac
    return 0
}

-o default할 것이다:

compspec이 일치하는 항목을 생성하지 않으면 Readline의 기본 파일 이름 완성이 사용됩니다.

답변2

파일 이름에 대한 기본 완성 동작을 원하면 를 실행하십시오 compopt -o default.

또 다른 대답은 COMPREPLY를 로 설정하는 것을 제안합니다 compgen -o default. 이는 비슷하지만 정확히 동일한 동작은 아닙니다(차이점을 보려면 디렉터리 이름 자동 완성을 시도하십시오).

관련 정보