Bash脚本中定义的Alias无法触发问题排查
解决Bash脚本中别名无法执行的问题
问题原因
虽然你开启了shopt -s expand_aliases,但通过${cluster}这种变量替换的方式执行命令时,Bash不会自动展开别名——别名是针对交互式命令行的输入展开设计的,变量替换后的字符串不会触发别名解析,因此脚本会把pepprodeuold当作普通命令去查找,导致"command not found"错误。
解决方案
推荐放弃使用别名,改用关联数组存储集群与对应kubectl命令的映射,这种方式更清晰、可靠,也避免了别名展开的问题。以下是修改后的脚本:
#!/usr/bin/env bash PROFILE="env-prod" REGIONS=("eu-central-1" "us-east-1") CLUSTERS_CONTEXT=("pepprodeu" "pepprodus" "pepprodeuold") # 用关联数组存储集群对应的kubectl命令,替代别名 declare -A CLUSTER_COMMANDS=( ["pepprodeuold"]="kubectl config use-context arn" ["pepprodeu"]="kubectl config use-context arn1" ["pepprodus"]="kubectl config use-context arn2" ) function clean_old_files () { echo "##################################### Cleaning old Files ###############################################" echo "Clean up Previous Reports" rm -rf eks_deployment_report.txt eks_node_report.txt get_eks_report } function get_deployment_count() { echo "##################################### Generating EKS DEPLOYMENT Report #####################################" echo "No of Deployments in ${cluster}" >> eks_deployment_report.txt kubectl get deployments --all-namespaces -o jsonpath='{range .items[*]}{.metadata.namespace}{" "}{.metadata.name}{" "}{.spec.replicas}{" "}{end}' | awk '$3 > 0 {count[$1]++} END {for (namespace in count) {print namespace, count[namespace]}}' | column -t | tee -a eks_deployment_report.txt echo "No of Nodes in ${cluster}" >> eks_node_report.txt kubectl get nodes --no-headers | wc -l | tee -a eks_node_report.txt } function get_eks_report() { for cluster in "${CLUSTERS_CONTEXT[@]}"; do echo "######################################## Get EKS Details in ${cluster} Cluster ########################################" echo "${cluster}" # 执行关联数组中对应的命令 ${CLUSTER_COMMANDS[$cluster]} get_deployment_count done } clean_old_files
注意:原脚本中
tee命令未加-a参数,会直接覆盖文件内容,修改为tee -a后可实现内容追加,避免后续集群的报告覆盖之前的结果。
备选方案(不推荐)
如果坚持要使用别名,可通过eval命令触发别名展开,修改get_eks_report函数中的执行逻辑:
eval "${cluster}"
但eval存在潜在安全风险,且可读性不如关联数组方式,因此不推荐使用。
内容的提问来源于stack exchange,提问作者Devops-Learner
相关产品推荐
相关产品推荐

