배쉬 완료가 lot of different variables 사용하는 잘못된 방식으로 동작이 예에서
. 그 중 일부는 입력을 처리하고 완료 할 매개 변수를 결정하는 데 사용됩니다.
다음 설명은, I는 (커서 등 |
)와 함께 본 시험의 입력을 사용한다 :
./test.sh ad re|garbage
${COMP_WORDS}
는 : 배열의 형태로 입력 된 모든 단어를 포함한다. ${COMP_WORDS[@]} == {"./test.sh", "ad", "regarbage"}
- 단어 구분 문자가
$COMP_WORDBREAKS
변수
$COMP_CWORD
에서 발견된다 : 이러한 경우에, 포함 된 커서 curently 선택되는 단어의 위치를 포함한다. 이 경우에는 다음을 포함합니다 : $COMP_CWORD == 2
$COMP_LINE
: 전체 입력을 문자열 형태로 포함합니다. 이 경우에는 다음을 포함합니다. $COMP_LINE == "./test.sh ad regarbage"
$COMP_POINT
: 전체 행에서 커서의 위치를 포함합니다. 이 경우, 포함 $COMP_POINT == 15
는
여전히 동일한 데이터를 사용하여 수행하는 단계를 cur=${COMP_WORDS[COMP_CWORD]}
regarbage
${COMP_WORD}
인 어레이에서 인덱스 2의 요소를 리턴한다.
이 동작을 피하려면 $COMP_LINE
및 $COMP_POINT
변수로 재생해야합니다. 여기에 내가 무엇을 최대 온 것입니다 :
# we truncate our line up to the position of our cursor
# we transform the result into an array
cur=(${COMP_LINE:0:$COMP_POINT})
# we use ${cur} the same way we would use ${COMP_WORDS}
COMPREPLY=($(compgen -W "add remove list use current" -- "${cur[$COMP_CWORD]}"))
출력 : 기본적으로 remove
및 garbage
사이에 공간이 없다는 것을
> ./test2.sh ad re|garbage
# press TAB
> ./test2.sh ad remove|garbage
참고. 이것이 당신이 원하는 행동이라면 완성 기술자를 따라 놀아야 할 것입니다.
마찬가지로, 예제에는 아무 것도 표시되지 않습니다. 버기가 무슨 뜻이야? 완료 스크립트를 제공 했습니까? '$ cur'의 내용은 무엇입니까? 'COMPREPLY' 선언 바로 전에 echo $ {COMP_WORDS [COMP_CWORD]}가 표시되는 것은 무엇입니까? – Aserre
보도 자료 공간, 왼쪽, 탭? –
@Aserre :'cur = $ {COMP_WORDS [COMP_CWORD]}'. 커서에 공간이 없으므로 물론 first_argumentgarbage입니다. – pihentagy