사용자 정의 스크립트에 대한 자동 완성 추가

사용자 정의 스크립트에 대한 자동 완성 추가

나는 현재 (를 통해) 소스에서 데비안 패키지를 자동으로 설치하는 내가 호출한 makeyourself.sh(에 링크된 ) 쉘 스크립트를 작업 중입니다 ./usr/bin/mysapt-get source -b $1

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

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

하지만 작동하지 않는 것 같습니다. 위에서 언급한 것처럼 탭 키를 누르면 at 매개변수가 로 변경되어 mysme 가 반환됩니다 sudo mys mys.

내가 도대체 ​​뭘 잘못하고있는 겁니까? 또는 complete와 같이 완성되어야 하는 문자열을 삽입해야 하는 명령의 위치를 ​​지정해야 합니까 ?{}$1

저는 Ubuntu 기반 Linux 배포판인 ElementaryOS를 사용합니다. 스크립트는 표준을 사용하는 표준 *.sh 쉘 스크립트입니다.#!/bin/bash

답변1

예상한 대로 명령은 완료할 작업에 대한 일부 정보를 수신합니다. 이는 설명서에 설명되어 있지만 설명서에는 나와 있지 않습니다.문서화complete내장, 당신은 읽어야프로그래밍 가능한 완성에 대한 소개 섹션.

-F및 옵션 으로 지정된 모든 쉘 함수 또는 명령이 -C호출됩니다. 명령이나 함수가 호출되면 COMP_LINE, COMP_POINT, COMP_KEYCOMP_TYPE 위에서 설명한 대로배쉬 변수). 쉘 함수가 호출되는 경우 COMP_WORDSCOMP_CWORD변수도 설정됩니다. 함수나 명령이 호출될 때 첫 번째 인수는 인수가 완성되는 명령의 이름이고, 두 번째 인수는 완성되는 단어이며, 세 번째 인수는 현재 명령줄에서 완성되는 단어 앞의 단어입니다. 완성된 단어에 대해 생성된 완성에 대한 필터링은 수행되지 않습니다. 함수나 명령은 일치 항목을 생성하는 데 있어 완전한 자유를 갖습니다.

따라서 명령은 세 가지 매개변수로 호출됩니다.

  • 명령 이름 - 하나의 스크립트에서 유사한 명령에 대한 완성을 결합할 수 있습니다.
  • 완성할 단어 - 어쨌든 필터링될 접두사로 출력을 제한할 수 있습니다.
  • 이전 단어 — 예를 들어 옵션을 완성하는 데 유용합니다.

동일한 매개변수가 완성 함수( complete -F somefunction)에 전달됩니다. 함수를 사용하든 명령을 사용하든 원하는 일치 항목을 필터링하는 것이 귀하의 임무입니다.

시도한 결과 최종 실행되는 명령은 입니다 apt-cache --no-generate pkgnames mys '' mys. 그러면 mys( apt-cache pkgnames첫 번째 피연산자만 확인) 으로 시작하는 패키지 이름 목록이 인쇄됩니다 . 가장 긴 공통 접두사는 이므로 mysbash는 완료를 시작 mys하고 사용자가 다음 문자를 선택하기를 기대합니다.

인수가 명령에 추가된다는 점을 고려하면(위치 매개변수로 전달되지 않고 인수가 -C셸 명령으로 구문 분석됨) 이를 구문 분석하는 쉬운 방법이 없습니다. 가장 간단한 해결책은 래퍼 기능을 사용하는 것입니다.

_mys () {
  COMPREPLY=$(apt-cache --no-generate pkgnames "$2")
}
complete -F _mys mys

관련 정보