ฉันกำลังพยายามเขียนฟังก์ชั่นเสร็จสิ้นสำหรับฟังก์ชั่นที่กำหนดเองบางอย่างที่ฉันเขียน แต่ดูเหมือนจะดิ้นรนกับแม้แต่พื้นฐานที่สุด
ฟังก์ชั่นตัวอย่างคือ:
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
ฉันพบเอกสารค่อนข้างเบาบางและติดตามยาก ฉันยังเห็น repo 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 ' '