환경

환경

Bash의 프로그래밍 가능 완성 기능을 조사하고 있는데 잘 이해되지 않는 부분이 있습니다.

환경

bash --version터미널에서 실행하면 이런 결과가 나옵니다.

GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

내가 이걸 다 운영하고 있어Ubuntu 22.04.2 LTS

두 개의 파일이 있습니다.

파일 1(스크립트)

첫 번째는 다음과 같이 프로그래밍 방식으로 수행하려는 스크립트입니다.

#!/usr/bin/env bash
#Script: dothis
echo "COMMAND: $0 $@"

보시다시피 이것은 스크립트 이름과 매개변수를 인쇄하는 더미 스크립트입니다.

파일 2(프로그래밍 가능 완료 스크립트)

두 번째 파일은 아래와 같이 이전 스크립트의 프로그래밍 가능한 완료를 담당하는 파일입니다.

#!/usr/bin/env bash

_dothis_completions(){
    # -S suffix
    COMPREPLY=($(compgen -A user -S '_suffix'  "${COMP_WORDS[1]}"))

    # -P prefix
    #COMPREPLY=($(compgen -A user -P 'prefix_'  "${COMP_WORDS[1]}"))
}

 complete -F _dothis_completions dothis

옵션(제안 항목에 접미사 추가)과 함께 사용하면 -S제대로 작동합니다. 이는 시스템 내 다양한 ​​사용자의 제안을 제공하며 _suffix마지막에 첨부됩니다.

이제 프로그래밍 방식 완료를 위한 스크립트를 다음과 같이 수정하면 다음과 같습니다.

#!/usr/bin/env bash

_dothis_completions(){
    # -S suffix
    #COMPREPLY=($(compgen -A user -S '_suffix'  "${COMP_WORDS[1]}"))

    # -P prefix
    COMPREPLY=($(compgen -A user -P 'prefix_'  "${COMP_WORDS[1]}"))
}

 complete -F _dothis_completions dothis

(이제 이 플래그를 사용하여 모든 제안에 -P접두사를 추가하고 싶습니다 )prefix_

명령줄에서 다시 시도했는데,이건 작동하지 않을 거야.

왜 이것이 작동하지 않는지 아는 사람이 있습니까?

미리 감사드립니다!

업데이트됨(2023년 7월 29일)

Zsh에서 Bash의 프로그래밍 가능 완성 기능을 사용하기로 결정했는데 문제 없이 작동하는 것 같았습니다.

이 정보가 Bash에서 "-P" 플래그가 제대로 작동하지 않는 이유에 대한 답을 찾는 데 도움이 되기를 바랍니다.

답변1

문제는 compgen -P ...이것이 오직 하나의 옵션만 남아 있을 때만 의미가 있는 것 같다는 것입니다. 어쩌면 완성을 생성할 때 접두사를 제거하여 이 문제를 해결할 수도 있습니다.

내 제안은 입력된 항목이 있는지, 완료 항목이 하나만 남아 있는지 확인하는 것입니다. 이는 하나가 다른 값의 첫 번째 부분인 두 값에서는 작동하지 않을 수 있습니다.

  • 부자
  • 푸바

foo그러면 선택의 여지가 없습니다.

_dothis_completions(){

    local -a tmp_array=()

    # -S suffix
    #COMPREPLY=($(compgen -A user -S '_suffix'  "${COMP_WORDS[1]}"))

    # -P prefix
    if [ -z "${COMP_WORDS[COMP_CWORD]}" ]; then
        COMPREPLY=($(compgen -A user "${COMP_WORDS[1]}"))
    else
        tmp_array=( $(compgen -A user "${COMP_WORDS[1]}") )
        if [ "${#tmp_array[@]}" -eq 1 ]; then
            COMPREPLY=($(compgen -A user -P 'prefix_'  "${COMP_WORDS[1]}"))
        else
            COMPREPLY=($(compgen -A user "${COMP_WORDS[1]}"))
        fi
    fi
}

complete -F _dothis_completions dothis

관련 정보