if [[ $COMP_CWORD -le $cmd_index ]]; then
# The user has not specified a command yet
local all_commands="$(tmux -q list-commands | cut -f 1 -d ' ')"
COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "${all_commands}" -- "${cur}") )
위의 tmux bash 조각을 이해하려고 노력 중입니다.자동 완성
compgen에 대한 W 인수는 단어 목록을 사용합니다. 그런데 왜 현재 단어에 대한 매개변수로 --
추가 옵션을 사용 합니까?${cur}
:-
중괄호는 무엇을 의미하나요?${COMPREPLY[@]:-}
이렇게 하면 tmux<tab>
표시되는 완성 목록은 동일합니다 $(tmux -q list-commands | cut -f 1 -d ' ')
. 그렇다면 우리는 왜 ${COMPREPLY[@]:-}
배열의 시작 부분에 있어야 할까요 ?
답변1
compgen -W "${all_commands}" -- "${cur}"
을 실행하려면 compgen
다음을 전달하세요.
- 하나의 매개변수가 있는 옵션
-W
, 변수의 값all_commands
; - 변수의 값인 비옵션 매개변수입니다
cur
.
이 --
매개변수는 옵션의 끝을 표시합니다. 값이 cur
대시로 시작 하더라도 옵션으로 해석되지 않습니다. 이는 명령줄 옵션 구문 분석에 대한 매우 일반적인 규칙입니다.
${COMPREPLY[@]:-}
이상한 것입니다. 그것은 사용한다매개변수 확장 구조 ${VARIABLE:-TEXT}
, 이는 거의 의미 없는 방식으로 VARIABLE
if set 및 null이 아닌 값 및 기타 값 으로 확장됩니다. TEXT
array 의 요소를 가져오지만 COMPREPLY
, 배열이 비어 있거나 정의되지 않은 경우 결과는 빈 문자열입니다. 그 다음에결과는 단어로 나누어지며, 각 단어는 전역 패턴으로 해석됩니다.. 이는 정의되지 않고 유효한 ${COMPREPLY[@]}
경우를 제외 하고는 정확히 동일합니다 . under 에서 정의되지 않은 경우 오류가 발생합니다. 특히 이 명령어는 배열에 추가되지 않고 삭제된다는 점에 유의하세요. 배열에 추가하려면 올바른 코드는 다음과 같습니다.COMPREPLY
set -u
set -u
${COMPREPLY[@]}
COMPREPLY
COMPREPLY
COMPREPLY+=($(compgen -W "${all_commands}" -- "${cur}") )
가정된 출력에는 compgen
공백으로 구분된 glob 패턴 목록이 포함되어 있습니다.
답변2
Double hyphen
선택적 매개변수의 끝을 의미합니다. 하이픈 뒤의 모든 항목은 위치 매개변수로 처리되어야 합니다. 더 읽기 @"--"(이중 대시)은(는) 무슨 뜻인가요? ('네이키드 더블 대시'라고도 함).
목적은 :-
배열 내부에서 빈 문자열을 제거하는 것입니다.
모든 문제가 해결되었습니다..감사합니다..