Bash 완료 설정에서(https://github.com/scop/bash-completioncomplete -F
) 내 시스템에서 제공하는데, 이는 완전 대 상대에 대한 명확한 선호도를 갖고 있는 것 같습니다 complete -C
.
complete -p | grep -- -C # no match
-F
둘 사이의 차이점은 get form 함수에는 변수에서 입력을 읽어 변수에 출력하는 함수가 필요한 반면, -C
get 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
고려 ) .cmd3
scp
ssh
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
참고로: