등호 뒤의 경로를 자동으로 완성하는 bash 완성 스크립트를 만드시겠습니까?

등호 뒤의 경로를 자동으로 완성하는 bash 완성 스크립트를 만드시겠습니까?

--arg인수를 인식하고 구성 할 수 있는 bash 완성 스크립트를 만들고 싶습니다 --some-arg=file.

읽고 나서이 튜토리얼의 몇 가지 예와 함께 /usr/share/bash_completion/completions/다음 스크립트를 작성했습니다(Chromium을 사용하여 일부 플래그를 입력하는 시간을 절약하기 위해).

_chromium() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # Some interesting options
    opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
    # Handle --xxxxxx=file
    if [[ ${cur} == "--"*"=" ]] ; then
        # Removed failures (is my logic OK?)
        return 0
    fi

    # Handle other options
    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _chromium chromium

에 저장 ~/bash_completions/chromium하고 를 사용하여 심볼릭 링크를 만들었습니다 sudo ln -s ~/bash_completions/chromium /usr/share/bash_completion/completions/chromium.
그런 다음 . /usr/share/bash_completions/completions/chromium.

이제 두 가지 문제가 있습니다.

  • chromium --u<TAB>chromium --user-data-dir=<SPACE>(이 공간을 원하지 않음) 으로 확장합니다 .
  • 경로(디렉터리 및 파일)가 더 이상 완전하지 않습니다.

이러한 문제를 어떻게 해결할 수 있습니까?

답변1

두 가지 문제에 대한 해결책을 찾았습니다!

  1. 공백을 추가하지 않으려면 이 nospace옵션을 사용하십시오. 이 작업은 두 가지 방법으로 수행할 수 있습니다.

    • 다음 주소로 전달하세요 complete.
      complete -o nospace -F _chromium chromium
    • compopt내장 사용 : (
      compopt -o nospace이 옵션 활성화)
      compopt +o nospace(이 옵션 비활성화)

    나는 gnu.org의 Bash 문서에서 이것을 찾았습니다.8.7 내장 기능의 프로그래밍 가능한 완성.

  2. 문서를 완성하세요.
    • Peterv가 제안한-f와 함께 로고를 사용하세요 compgen. 나는 그 조언을 따라 그것을 COMPREPLY=( $(compgen -f "$cur") ).
      스택 오버플로에서 찾았습니다.이 답변완성 목록을 수동으로 생성하는 것이 좋습니다(사용하지 않음 compgen). 이 방법은 매우 효과적입니다.
    • filenames옵션을 사용하면 Readline compspec이 다음을 수행할 수 있도록 파일 이름을 생성하도록 지시합니다.
      • 파일 이름별 처리 수행(디렉터리 이름에 슬래시 추가, 특수 문자 인용, 후행 공백 억제 등)
      • 다양한 색상을 사용하여 파일 형식 표시( colored-stats활성화)

의 도움으로Bash의 문자열 작업(공백을 확장 ~하고 처리하기 위해) 질문에 명시된 모든 기준을 충족하는 bash 완성 스크립트를 만들었습니다.

_chromium() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # Some interesting options
    opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
    # Handle --xxxxxx=
    if [[ ${prev} == "--"* && ${cur} == "=" ]] ; then
        compopt -o filenames
        COMPREPLY=(*)
        return 0
    fi
    # Handle --xxxxx=path
    if [[ ${prev} == '=' ]] ; then
        # Unescape space
        cur=${cur//\\ / }
        # Expand tilder to $HOME
        [[ ${cur} == "~/"* ]] && cur=${cur/\~/$HOME}
        # Show completion if path exist (and escape spaces)
        compopt -o filenames
        local files=("${cur}"*)
        [[ -e ${files[0]} ]] && COMPREPLY=( "${files[@]// /\ }" )
        return 0
    fi

    # Handle other options
    COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
    if [[ ${#COMPREPLY[@]} == 1 && ${COMPREPLY[0]} != "--"*"=" ]] ; then
        # If there's only one option, without =, then allow a space
        compopt +o nospace
    fi
    return 0
}
complete -o nospace -F _chromium chromium

답변2

-f파일 이름을 완성하려면 에 전달해 보세요 compgen.

옵션 뒤의 공백을 제거할 수 없을까 걱정됩니다. 완성이 작동하는 방식이기 때문입니다. 고유한 일치 항목을 찾으면 완전히 완료됩니다.

관련 정보