사용자 정의 스크립트에 자동 완성 기능 추가

사용자 정의 스크립트에 자동 완성 기능 추가

나는 현재 소스에서 (via) 데비안 패키지를 자동으로 설치하는 makeyourself.sh(link to )라는 쉘 스크립트를 작성 중입니다 ./usr/bin/mysapt-get source -b $1

그래서 첫 번째 인수로 제공된 패키지 이름에 자동 완성 기능을 추가하기로 결정했습니다. sudo mys panth<tab><tab>그런 다음 — 로 시작하는 모든 패키지를 나열합니다 panth. 시도는 다음과 같습니다.

complete -C "apt-cache --no-generate pkgnames" mys

하지만 작동하지 않는 것 같습니다. 위에서 언급한 Tab 키를 누르면 at 매개변수가 로 변경되어 mysme 를 반환합니다 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

관련 정보