From 6f27d734c807dc510163649c47881a4f11a4f673 Mon Sep 17 00:00:00 2001 From: Yu Xiang Zhang Date: Fri, 23 Jan 2026 17:09:39 -0500 Subject: [PATCH] perf(aws): speed up aws_profiles by parsing config files directly Parse ~/.aws/config and ~/.aws/credentials directly instead of invoking `aws configure list-profiles`, which has significant startup overhead due to the Python-based AWS CLI. Falls back to AWS CLI if neither file is readable. Co-Authored-By: Claude --- plugins/aws/aws.plugin.zsh | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh index 0c43031df..a1932cba0 100644 --- a/plugins/aws/aws.plugin.zsh +++ b/plugins/aws/aws.plugin.zsh @@ -239,9 +239,30 @@ function aws_regions() { } function aws_profiles() { - aws --no-cli-pager configure list-profiles 2> /dev/null && return - [[ -r "${AWS_CONFIG_FILE:-$HOME/.aws/config}" ]] || return 1 - grep --color=never -Eo '\[.*\]' "${AWS_CONFIG_FILE:-$HOME/.aws/config}" | sed -E 's/^[[:space:]]*\[(profile)?[[:space:]]*([^[:space:]]+)\][[:space:]]*$/\2/g' + local config_file="${AWS_CONFIG_FILE:-$HOME/.aws/config}" + local credentials_file="${AWS_SHARED_CREDENTIALS_FILE:-$HOME/.aws/credentials}" + local profiles=() + + # Parse config file: match [default], [profile name], but not [sso-session ...] etc. + # Pattern handles optional whitespace around brackets and profile keyword + if [[ -r "$config_file" ]]; then + profiles+=($(grep --color=never -Eo '\[.*\]' "$config_file" \ + | sed -nE 's/^[[:space:]]*\[(profile[[:space:]]+)?([^[:space:]]+)[[:space:]]*\]$/\2/p' \ + | grep -v '^sso-session$')) + fi + + # Parse credentials file (profiles have [name] format, no "profile" prefix) + if [[ -r "$credentials_file" ]]; then + profiles+=($(grep --color=never -Eo '\[.*\]' "$credentials_file" \ + | sed -nE 's/^[[:space:]]*\[([^[:space:]]+)[[:space:]]*\]$/\1/p')) + fi + + # Return unique profiles, or fall back to AWS CLI + if [[ ${#profiles[@]} -gt 0 ]]; then + printf '%s\n' "${profiles[@]}" | sort -u + else + aws --no-cli-pager configure list-profiles 2>/dev/null + fi } function _aws_regions() {