나는 현재 소스에서 (via) 데비안 패키지를 자동으로 설치하는 makeyourself.sh
(link to )라는 쉘 스크립트를 작성 중입니다 ./usr/bin/mys
apt-get source -b $1
그래서 첫 번째 인수로 제공된 패키지 이름에 자동 완성 기능을 추가하기로 결정했습니다. sudo mys panth<tab><tab>
그런 다음 — 로 시작하는 모든 패키지를 나열합니다 panth
. 시도는 다음과 같습니다.
complete -C "apt-cache --no-generate pkgnames" mys
하지만 작동하지 않는 것 같습니다. 위에서 언급한 Tab 키를 누르면 at 매개변수가 로 변경되어 mys
me 를 반환합니다 sudo mys mys
.
내가 뭘 잘못했나요? 또는 complete
와 같이 완성되어야 하는 문자열을 삽입해야 하는 위치를 명령에 지정해야 합니까 ?{}
$1
저는 Ubuntu 기반 Linux 배포판인 ElementaryOS를 사용합니다. 스크립트는 표준을 사용하는 표준 *.sh 쉘 스크립트입니다.#!/bin/bash
답변1
의심할 수 있듯이 명령은 수행할 작업에 대한 일부 정보를 받습니다. 설명서에 설명되어 있지만complete
내장 문서, 읽어야 해프로그래밍 가능한 입문 부분.
-F
및 옵션으로 지정된 쉘 함수 또는 명령을 호출합니다 .-C
명령이나 함수가 호출되면 위에서 설명한 대로COMP_LINE
,COMP_POINT
,COMP_KEY
변수 에 값이 할당됩니다(참조:COMP_TYPE
배쉬 변수). 쉘 함수가 호출되는 경우COMP_WORDS
및 변수도 설정됩니다.COMP_CWORD
함수나 명령이 호출될 때 첫 번째 인수는 인수가 완성되는 명령의 이름이고, 두 번째 인수는 완성되는 단어이며, 세 번째 인수는 현재 명령줄에서 완성되는 단어 앞의 단어입니다. 생성된 완성은 완성되는 단어를 기준으로 필터링되지 않습니다. 함수나 명령은 일치 항목을 생성하는 데 있어 완전한 자유를 갖습니다.
따라서 이 명령은 세 가지 매개변수로 호출됩니다.
- 명령 이름 - 유사한 명령의 완성을 하나의 스크립트에 결합할 수 있습니다.
- 완성할 단어 - 어쨌든 필터링될 접두사로 출력을 제한할 수 있습니다.
- 이전 단어 - 예를 들어 옵션을 완성하는 데 유용합니다.
동일한 매개변수가 완성 함수( complete -F somefunction
)에 전달됩니다. 함수를 사용하든 명령을 사용하든 원하는 일치 항목을 필터링하는 것이 귀하의 임무입니다.
시도한 결과에 따라 실행된 명령은 입니다 apt-cache --no-generate pkgnames mys '' mys
. 그러면 mys
( apt-cache pkgnames
첫 번째 피연산자만 확인) 으로 시작하는 패키지 이름 목록이 인쇄됩니다 . 가장 긴 공통 접두사는 mys
이므로 bash는 완료를 시작 mys
하고 사용자가 다음 문자를 선택하기를 기대합니다.
인수는 명령에 추가되므로(위치 인수로 전달되지 않고 인수는 -C
셸 명령으로 구문 분석됨) 이를 구문 분석하는 쉬운 방법이 없습니다. 가장 간단한 해결책은 래퍼 기능을 사용하는 것입니다.
_mys () {
COMPREPLY=$(apt-cache --no-generate pkgnames "$2")
}
complete -F _mys mys