Estou tentando escrever funções de conclusão para algumas funções personalizadas que escrevi, mas parece estar realmente lutando com as mais básicas.
Um exemplo de função é:
function eb_instances() {
if [ "$#" -ne 2 ]; then
echo "Usage eb_instances <aws profile name> <environment name>"
echo "e.g.:"
echo " eb_instances production kraken-prod-api"
return 1
fi
aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" "Name=tag:Name,Values=$2" --profile=$1 --output=json | jq -r ".Reservations[].Instances[].PrivateIpAddress"
}
Isso tem dois argumentos posicionais, <aws profile name>
e<environment name>
Quero que as opções de conclusão <aws profile name>
estejam disponíveis dinamicamente executando
sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
, e as conclusões para <environment name>
que estejam disponíveis dinamicamente executando outra função que chamei eb_names
.
Estou achando a documentação bastante escassa e difícil de seguir. Também vi o repositório zsh-completions para comandos semelhantes, mas não consigo encontrar algo semelhante ao que eu preciso.
Qualquer ajuda para começar seria muito apreciada!
Atualizar
Com base na resposta de @ cuonglm , usei:
#compdef ebinstances
_ebinstances() {
local state
_arguments \
'1: :->aws_profile'\
'*: :->eb_name'
case $state in
(aws_profile) _arguments '1:profiles:($(sed -n -E "s/\[([a-zA-Z0-9_\-]+)\]/\1/p" ~/.aws/credentials | tr \\n " "))' ;;
(*) compadd "$@" foo bar
esac
}
_ebinstances "$@"
O que eu esqueci de mencionar na pergunta original era que eu também queria que a conclusão do segundo argumento dependesse do primeiro (ambos os quais são dinâmicos com base na execução de algum código), por exemplo:
$ eb_instances <cursor>TAB
cuonglm test
obtém as conclusões que eu quero. Depois de selecionar, diga o primeiro e tente concluir automaticamente:
$ eb_instances cuonglm <cursor>TAB
Desejo gerar as opções de conclusão executando eb_names cuonglm
e, se possível, também uma pesquisa detalhada das conclusões, por exemplo, se o candidato correto foi foo-bar
,
$ eb_instances cuonglm foo<cursor>TAB
Quero gerar as opções de conclusão executando eb_names cuonglm foo
fonte
cuonglm test
virsed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
(cuonglm test)
por($(sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '))
, mudecompadd "$@" prod staging dev
paracompadd "$@" $(eb_names)
.eb_names
pelo primeiro argumento, ou seja,production
oustaging
como faço isso? Muito obrigado, já resolvi algumas coisas com isso.$1
ou$2
, mas nenhum dado.