
Я пытаюсь написать функцию завершения для пользовательской оболочки SSH под названием myssh. myssh принимает аргументы командной строки в одной из следующих форм:
myssh [myssh options] [ssh args]
или
myssh [myssh options] -- [ssh options] [ssh args]
Как можно обеспечить автодополнение для специфичных для myssh опций, повторно используя существующее автодополнение для ssh?
правка: Я бы тоже хотел использовать _gnu_generic
функциюупомянуто здесьдля заполнения параметров myssh.
решение1
В более общем случае, когда комментарий @Franklin\ Yu недостаточен, вы можете создать соответствующую команду завершения. Возьмем, к примеру, команду flux
. Эта команда, как и многие ей подобные, довольно требовательна и ожидает, что ее первым параметром команды завершения будет имя исходной команды, поэтому это не срабатывает:
$ compdef myflux=flux
$ myflux<tab>
l2advertisement.yaml pool.yaml # <--- not expected
Введение вспомогательной команды, которая заменяет первую myflux
в $words
переменной, исправляет эту проблему:
_myflux() {
words="flux ${words[@]:1}" # replace myflux with flux, in `words` array
_flux # call original completion command which expects a words array beginning with `flux`
}
$ compdef _myflux myflux
$ myflux<tab>
bootstrap -- Deploy Flux on a cluster the GitOps way.
build -- Build a flux resource
check ...
...
# the above *is* expected.
Иногда вы оборачиваете исходную команду подкомандами, напримерflux get source
Строка с мутацией массива $words
тогда будет выглядеть так:
words="flux get source ${words[@]:1}"