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