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

使用curl在Bats脚本中执行HTTP POST时读取文件报错求助

解决Bats测试中curl POST请求读取文件失败的问题

报错原因分析

curl: option -d: error encountered when reading a file 报错通常由以下几种情况导致:

  • 相对路径错误:Bats测试执行时的工作目录与脚本所在目录不一致,导致./folder/request.json无法找到文件
  • 文件不存在:路径拼写错误或目标文件被删除/移动
  • 权限不足:当前执行用户没有该文件的读取权限

解决方案

1. 使用绝对路径定位文件

通过获取脚本所在的绝对目录,拼接文件路径,彻底避免工作目录变化带来的路径问题:

@test "Test 1" {
    sleep 5s
    
    # 获取脚本所在的绝对目录
    SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
    # 拼接测试文件的绝对路径
    TEST_FILE="$SCRIPT_DIR/folder/request.json"
    
    TEST_URL_HTTP="http://10.15.33.230:8080/service/v1/lb"
    RESPONSE=""
    for x in {0..20} ;
    do
        echo "Sending request to $TEST_URL_HTTP"

        # 使用绝对路径读取文件
        RESPONSE=$(curl --connect-timeout 1 -s -f -X POST  -H 'Content-Type: application/json' -d "@$TEST_FILE" "$TEST_URL_HTTP") && break
        sleep 5
    done
    
    if [ $x -lt 20 ] ;
    then
        echo "Received echo response"
    else
        echo "Failed to get echo response"
        exit 1
    fi
}

2. 提前检查文件状态

在执行curl前加入文件存在性和权限检查,快速定位问题根源:

# 检查文件是否存在
if [ ! -f "$TEST_FILE" ]; then
    echo "Error: 测试文件 $TEST_FILE 不存在"
    exit 1
fi
# 检查文件是否可读
if [ ! -r "$TEST_FILE" ]; then
    echo "Error: 没有 $TEST_FILE 的读取权限"
    exit 1
fi

3. 临时验证路径正确性

可以在测试代码中添加临时打印命令,确认当前工作目录和文件路径是否匹配预期:

echo "当前工作目录: $(pwd)"
echo "测试文件路径: $TEST_FILE"
ls -l "$TEST_FILE"

内容的提问来源于stack exchange,提问作者Starbucks Admin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:40:16