我正在尝试为名为 myssh 的 SSH 自定义包装器编写一个完成函数。 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}"