我正在尝试为我编写的一些自定义函数编写完成函数,但是即使是最基本的函数,似乎也很挣扎。
一个示例函数是:
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"
}
这有两个位置参数,<aws profile name>
以及<environment name>
我希望<aws profile name>
可以通过运行来动态获得
完成选项sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '
,并<environment name>
希望通过运行我调用的另一个函数来动态实现完成选项eb_names
。
我发现文档非常稀疏且难以遵循。我也看到过类似命令的zsh-completions存储库,但似乎找不到与我需要的东西类似的东西。
任何帮助入门将不胜感激!
更新资料
基于@cuonglm的答案,我使用了:
#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 "$@"
我在原始问题中忘记提及的是,我还希望第二个参数的完成取决于第一个参数(这两个参数都是基于动态执行某些代码),例如:
$ eb_instances <cursor>TAB
cuonglm test
得到我想要的完成。一旦选择第一个,然后尝试自动完成:
$ eb_instances cuonglm <cursor>TAB
我想通过执行来生成补全选项eb_names cuonglm
,并且,如果可能的话,还可以对补全进行深入分析,例如,如果正确的候选人是foo-bar
,
$ eb_instances cuonglm foo<cursor>TAB
我想通过执行生成完成选项 eb_names cuonglm foo
cuonglm test
来自sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '