簡體   English   中英

如何將shell完成推遲到bash和zsh中的另一個命令?

[英]How do I defer shell completion to another command in bash and zsh?

我正在嘗試編寫一個shell腳本實用程序,它將其他shell實用程序包裝到一個CLI中,並且我試圖讓shell完成在zsh和bash中工作。

例如,假設CLI名為util

util aws [...args] #=> runs aws
util docker [...args] #=> runs docker
util terraform [...args] #=> runs terraform

理想情況下,我想要的是zsh和bash完成中的一種方式,能夠獨立於包裝腳本的完成實現來說“像其他命令Y一樣完成此子命令X”。

就像是:

compdef 'util aws'='aws'
compdef 'util docker'='docker'
compdef 'util terraform'='terraform'

拉伸目標是允許在另一個二進制文件中完成對子命令的任意子命令:

util aws [...args] #=> completes against `aws`
util ecr [...args] #=> completes against `aws ecr`

這有可能嗎? 我一直在嘗試模擬各個二進制文件的完成腳本,但是其他完成腳本的編寫方式也存在很大差異。

我對zsh一無所知,但我可以為bash提供解決方案。 它使用_complete函數委托(我在muru的建議下找到了 - 好的電話!)。

函數的第二部分為util命令本身提供了完成,我假設這里只是一個子命令列表。 當然,您可以根據自己的需要量身定制。

第一部分在已經鍵入完整子命令的情況下處理委托,並且可選地根據子命令的完成來處理完成目標。

功能

_delegate() {
  local cur subs
  cur="${COMP_WORDS[COMP_CWORD]}" # partial word, if any
  subs="ssh aws docker terraform"
  if [[ $COMP_CWORD == 2 ]]; then
    # Two whole words before the cursor - delegate to the second arg
    _command $2
  else
    # complete with the list of subcommands 
    COMPREPLY=( $(compgen -W "${subs}" -- ${cur}) )
  fi
}

安裝

njv@pandion:~$ complete -F _delegate util

演示

1d [njv@eidolon:~] $ util
aws        docker     ssh        terraform
1d [njv@eidolon:~] $ util ssh
::1                        gh                         ip6-localhost              ubuntu.members.linode.com
eidolon                    github.com                 ip6-loopback
ff02::1                    ip6-allnodes               localhost
ff02::2                    ip6-allrouters             ubuntu
1d [njv@eidolon:~] $ util ssh ip6-
ip6-allnodes    ip6-allrouters  ip6-localhost   ip6-loopback

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM