Tmux bash 전체 코드 연습

Tmux bash 전체 코드 연습
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}, 이는 거의 의미 없는 방식으로 VARIABLEif set 및 null이 아닌 값 및 기타 값 으로 확장됩니다. TEXTarray 의 요소를 가져오지만 COMPREPLY, 배열이 비어 있거나 정의되지 않은 경우 결과는 빈 문자열입니다. 그 다음에결과는 단어로 나누어지며, 각 단어는 전역 패턴으로 해석됩니다.. 이는 정의되지 않고 유효한 ${COMPREPLY[@]}경우를 제외 하고는 정확히 동일합니다 . under 에서 정의되지 않은 경우 오류가 발생합니다. 특히 이 명령어는 배열에 추가되지 않고 삭제된다는 점에 유의하세요. 배열에 추가하려면 올바른 코드는 다음과 같습니다.COMPREPLYset -uset -u${COMPREPLY[@]}COMPREPLYCOMPREPLY

COMPREPLY+=($(compgen -W "${all_commands}" -- "${cur}") )

가정된 출력에는 compgen공백으로 구분된 glob 패턴 목록이 포함되어 있습니다.

답변2

Double hyphen선택적 매개변수의 끝을 의미합니다. 하이픈 뒤의 모든 항목은 위치 매개변수로 처리되어야 합니다. 더 읽기 @"--"(이중 대시)은(는) 무슨 뜻인가요? ('네이키드 더블 대시'라고도 함).

목적은 :-배열 내부에서 빈 문자열을 제거하는 것입니다.

모든 문제가 해결되었습니다..감사합니다..

관련 정보