You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Action ubuntu-latest环境下Bash脚本执行报错求助

问题:Bash脚本在GitHub Action环境执行失败,本地运行正常

脚本内容

set -e

get_named_query_output=$(aws athena get-named-query --named-query-id $NAMED_QUERY_ID)
named_query_string=$(echo "$get_named_query_output" | jq -r '.NamedQuery.QueryString')
named_query_workgroup=$(echo "$get_named_query_output" | jq -r '.NamedQuery.WorkGroup')
named_query_database=$(echo "$get_named_query_output" | jq -r '.NamedQuery.Database')

start_query_output=$(aws athena start-query-execution \
    --query-string "$named_query_string" \
    --work-group "$named_query_workgroup" \
    --query-execution-context "Database=$named_query_database" \
    --result-configuration "OutputLocation=$S3_OUTPUT_LOCATION")

query_execution_id=$(echo "$start_query_output" | jq -r '.QueryExecutionId')

check_interval_seconds=5
start_run_time=$(date +%s)

poll_execution_status() {
    while true; do
        current_run_time=$(date +%s)

        if ((current_run_time - start_run_time > 30)); then
            echo "Timeout exceeded"

            exit 1
        fi

        execution_status=$(aws athena get-query-execution \
            --query-execution-id "$query_execution_id" \
            --query 'QueryExecution.Status.State' \
            --output text)

        if [ "$execution_status" == "SUCCEEDED" ]; then
            echo "Query execution succeeded"

            exit 0
        elif [ "$execution_status" == "FAILED" ] || [ "$execution_status" == "CANCELLED" ]; then
            echo "Query execution failed or was cancelled"

            exit 1
        else
            echo "Query is still running. Checking again in $check_interval_seconds seconds..."

            sleep $check_interval_seconds
        fi
    done
}

poll_execution_status

Terraform触发配置

resource "terraform_data" "create_athena_table_usage_script" {
  provisioner "local-exec" {
    command = "chmod +x ${path.module}/scripts/generate-athena-table-usage.sh; ${path.module}/scripts/generate-athena-table-usage.sh"

    environment = {
      NAMED_QUERY_ID     = aws_athena_named_query.create_usage_table.id
      S3_OUTPUT_LOCATION = "s3://${module.s3_bucket_usage_data.s3_bucket_id}"
    }
  }
}

出现的错误

错误1:[: SUCCEEDED: unexpected operator

module.usage_service["production"].terraform_data.create_athena_table_usage_script (local-exec): modules/usage-service/scripts/generate-athena-table-usage.sh: 34: [: SUCCEEDED: unexpected operator
module.usage_service["production"].terraform_data.create_athena_table_usage_script (local-exec): modules/usage-service/scripts/generate-athena-table-usage.sh: 38: [: SUCCEEDED: unexpected operator
module.usage_service["production"].terraform_data.create_athena_table_usage_script (local-exec): modules/usage-service/scripts/generate-athena-table-usage.sh: 38: [: SUCCEEDED: unexpected operator
module.usage_service["production"].terraform_data.create_athena_table_usage_script (local-exec): Query is still running. Checking again in 5 seconds...

错误2:current_run_time: not found

module.usage_service["production"].terraform_data.create_athena_table_usage_script (local-exec): modules/usage-service/scripts/generate-athena-table-usage.sh: 23: current_run_time: not found
module.usage_service["staging"].terraform_data.create_athena_table_usage_script (local-exec): modules/usage-service/scripts/generate-athena-table-usage.sh: 23: current_run_time: not found

问题原因与解决方案

两个错误的核心原因是GitHub Action的ubuntu-latest环境中,Terraform的local-exec默认使用sh(dash)而非bash执行脚本,而原脚本使用了bash专属语法。

针对性修复

  1. 解决[: SUCCEEDED: unexpected operator错误

    • sh不支持==作为字符串相等比较符,需替换为=
    • 将所有[ "$execution_status" == "SUCCEEDED" ]类判断改为[ "$execution_status" = "SUCCEEDED" ]
  2. 解决current_run_time: not found错误

    • sh不支持((...))算术扩展语法,改用标准的[ $(($current_run_time - $start_run_time)) -gt 30 ]格式
  3. 更稳妥的兜底方案

    • 在脚本第一行添加#!/bin/bash,强制指定bash解释器
    • 或者在Terraform的local-exec命令中明确用bash执行脚本:bash ${path.module}/scripts/generate-athena-table-usage.sh

修改后的完整脚本

#!/bin/bash
set -e

get_named_query_output=$(aws athena get-named-query --named-query-id $NAMED_QUERY_ID)
named_query_string=$(echo "$get_named_query_output" | jq -r '.NamedQuery.QueryString')
named_query_workgroup=$(echo "$get_named_query_output" | jq -r '.NamedQuery.WorkGroup')
named_query_database=$(echo "$get_named_query_output" | jq -r '.NamedQuery.Database')

start_query_output=$(aws athena start-query-execution \
    --query-string "$named_query_string" \
    --work-group "$named_query_workgroup" \
    --query-execution-context "Database=$named_query_database" \
    --result-configuration "OutputLocation=$S3_OUTPUT_LOCATION")

query_execution_id=$(echo "$start_query_output" | jq -r '.QueryExecutionId')

check_interval_seconds=5
start_run_time=$(date +%s)

poll_execution_status() {
    while true; do
        current_run_time=$(date +%s)

        if [ $(($current_run_time - $start_run_time)) -gt 30 ]; then
            echo "Timeout exceeded"
            exit 1
        fi

        execution_status=$(aws athena get-query-execution \
            --query-execution-id "$query_execution_id" \
            --query 'QueryExecution.Status.State' \
            --output text)

        if [ "$execution_status" = "SUCCEEDED" ]; then
            echo "Query execution succeeded"
            exit 0
        elif [ "$execution_status" = "FAILED" ] || [ "$execution_status" = "CANCELLED" ]; then
            echo "Query execution failed or was cancelled"
            exit 1
        else
            echo "Query is still running. Checking again in $check_interval_seconds seconds..."
            sleep $check_interval_seconds
        fi
    done
}

poll_execution_status

内容的提问来源于stack exchange,提问作者Tal Rofe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:13:10