Я пытаюсь написать функции завершения для некоторых пользовательских функций, которые я написал, но, похоже, действительно борется даже с самыми простыми.
Пример функции:
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-дополнений для похожих команд, но не могу найти что-то похожее на то, что мне нужно.
Любая помощь с самого начала будет высоко ценится!
Обновить
Основываясь на ответе @ 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 ' '
(cuonglm test)
с($(sed -n -E 's/\[([a-zA-Z0-9_\-]+)\]/\1/p' ~/.aws/credentials | tr \\n ' '))
, измененияcompadd "$@" prod staging dev
вcompadd "$@" $(eb_names)
.eb_names
первый аргумент, т. е.production
илиstaging
, как мне это сделать? Большое спасибо, я получил несколько вещей, отсортированных с этим.$1
или$2
, но не кости.