배쉬 완료 -C 및 -F

배쉬 완료 -C 및 -F

Bash 완료 설정에서(https://github.com/scop/bash-completioncomplete -F) 내 시스템에서 제공하는데, 이는 완전 대 상대에 대한 명확한 선호도를 갖고 있는 것 같습니다 complete -C.

complete -p | grep -- -C # no match

-F둘 사이의 차이점은 get form 함수에는 변수에서 입력을 읽어 변수에 출력하는 함수가 필요한 반면, -Cget form 명령은 위치 인수에서 입력을 읽어 에 출력하는 함수가 필요한 것 같습니다 stdout.

나는 두 번째 접근 방식이 더 실용적이고 완성 함수/프로그램을 디버그하기가 더 쉽기 때문에 선호합니다(특정 변수 컨텍스트에 의존하지 않기 때문입니다).

하지만,https://github.com/scop/bash-completion전자를 선호하는 점이 궁금합니다. -C새 프로세스의 명백한 성능 오버헤드(IMHO UI에서는 무시할 수 있음) 외에 이 접근 방식에 단점이 있습니까?

답변1

complete -C {command}후자는 실제로 기능이 필요하기 때문에 왜 "더 실용적인" 것을 고려하는지 잘 모르겠습니다 complete -F {function}. 따라서 귀하가 선호하는 이유가 불분명합니다. 하지만 당신 말이 맞습니다. 거의 모든 예제와 문서는 예를 들어 complete ... -F {function} ...complete -F _foobar foobar함수가 _foobar가상 명령에 대한 완성 옵션을 생성하는 데 사용됩니다 foobar.

주된 이유는 다음과 같은 것으로 추측됩니다.

  • " " 함수는 _foobar여러 명령을 완료하는 데 사용할 수 있습니다. 예를 들어 패키지에는 foobar완료 되는 명령의 이름을 알 수 있도록 함수에 전달되는 foo명령이 bar있을 수도 있습니다.$1
  • 함수 변형은 완성을 수행하기 위해 더 많은 정보를 제공하는 것으로 보입니다. -C" " 변형은 비교해 보면 더 멍청해 보입니다(하지만, 저는 -F항상 " " 변형을 사용합니다.)
  • 명령의 출력에 의존하는 것보다 함수(COMPREPLY 배열 변수를 통해)를 통해 완료 옵션을 설정하는 것이 더 쉽기 때문에 명령이 하위 프로세스에서 실행되므로 정보를 전달하고 가져오기가 어렵습니다.
  • "-C 명령" 변형은 하위 프로세스를 생성하고 "tab-tab-tab" 누르기가 완료되면 순간적인 느낌을 주기를 원할 때 추가 지연을 생성합니다.
  • "-C 명령" 변형은 complete명령문에 길고 복잡한 명령을 포함하거나 외부 쉘 스크립트를 호출합니다. 이 경우 해당 스크립트의 위치를 ​​보내고 추적해야 합니다(이는 고통스러운 프로세스입니다).

또한 개인적으로 "완료" 작업을 통해 bash의 이전 버전과 다양한 Unix(AIX, HP-UX, Solaris, Linux, BSD)에서 작업하도록 해야 했고 이를 지원하는 다양한 항목을 발견했습니다. 작업할 때 " complete"가 반환되므로 true다음 관용구를 사용합니다. 이는 bash 버전 간에 더 이식성이 있는 것 같습니다( -F {function} {commmand}" "의 사용법이 해당 ""/ Cleaner보다 간단하다는 것을 보여주기 때문에 여기에만 포함합니다 -C "command").

complete -o bashdefault -o default -o nospace -F _cmd cmd 2>/dev/null \
|| complete             -o default -o nospace -F _cmd cmd 2>/dev/null \
|| complete             -o default            -F _cmd cmd 2>/dev/null \
|| complete                                   -F _cmd cmd

cmd1마찬가지로 , 가 있는 경우 모두 본질적으로 동일한 완성을 사용합니다(예: 생성한 호스트 이름 목록을 사용하는 에 대한 완성 스크립트를 cmd2고려 ) .cmd3scpssh

for c in cmd1 cmd2 cmd3; do
    # or that long complete statement shown above
    complete -o bashdefault -o default -o nospace -F _cmd $c 2>/dev/null
done

참고로:

관련 정보