GCP资源存在性检查最佳实践及Bash脚本重定向问题排查
优化Bash脚本:正确检查GCP项目创建完成状态
问题场景
执行gcloud projects create fsadykov-test创建GCP项目后,用以下脚本循环检查项目是否可用:
until gcloud projects list | grep "$GCP_PROJECT_TO_CREATE" &> /dev/null; do logger "The Google is preparing the project <$GCP_PROJECT_TO_CREATE> please wait!" "info" && sleep 10 done
但实际运行时,控制台反复出现Listed 0 items.的输出,无法被&>重定向屏蔽,预期只显示自定义的等待提示日志。此前有用户反馈gcloud projects list的提示信息会输出到标准错误流,导致常规重定向无法屏蔽,查阅相关问题后仍未解决。
解决方案:改用更高效的检查方式
不要用gcloud projects list配合grep的方式,而是直接使用gcloud projects describe命令——该命令专门用于查询单个项目的详情,返回码直接反映项目是否存在(存在返回0,不存在返回非0),同时能避免不必要的全项目列表查询,更符合DRY原则。
修改后的脚本:
# 先定义环境变量 export GCP_PROJECT_TO_CREATE="fsadykov-test" until gcloud projects describe "$GCP_PROJECT_TO_CREATE" &>/dev/null; do logger "Google正在准备项目<$GCP_PROJECT_TO_CREATE>,请稍候!" "info" && sleep 10 done
关键说明
- 重定向生效的核心:
&>/dev/null是Bash中同时重定向标准输出(stdout)和标准错误(stderr)到/dev/null的写法,能彻底屏蔽gcloud命令的所有输出。如果需要兼容POSIX标准Shell,可替换为>/dev/null 2>&1。 - 为什么不用list+grep:
gcloud projects list会返回所有有权限查看的项目,API调用开销更大Listed 0 items.这类提示信息是输出到stderr的,仅重定向stdout的话无法屏蔽,而describe命令在项目不存在时不会产生这类冗余提示
- DRY脚本实践:使用环境变量存储项目名,避免硬编码,提高脚本的复用性和维护性
内容的提问来源于stack exchange,提问作者Farkhod Sadykov
相关产品推荐
相关产品推荐

