curl执行报错argument list too long,参考现有方案仍未解决求助
解决方案
报错原因
你原命令的报错核心原因:$(cat data.txt | base64 --wrap=0) 会把整个文件编码后的内容直接展开到curl的命令行参数中,当文件体积偏大时,展开后的参数总长度超过了Linux系统默认的命令行参数长度限制,就会触发「argument list too long」错误。另外你原命令中同时写了-d @data.txt和把data.txt内容嵌入JSON的逻辑,属于重复传参,会导致请求体格式错误,需要先删掉多余的-d @data.txt。
修复方案
方案1(推荐,无临时文件、自动处理特殊字符)
借助jq构造符合格式的JSON请求体,通过管道直接传给curl,全程不会把大文件内容放到命令行参数中:
cat data.txt | base64 --wrap=0 | jq -R --arg fname "$FileName" '{ "data": { "type": "attachments", "attributes": { "attachment": { "content": ., "file_name": $fname } } } }' | curl -X POST https://Path/to/attachments \ -H 'content-type: application/vnd.api+json' \ -H 'x-api-key: KEY' \ -d @-
其中-d @-表示让curl从标准输入读取POST请求体内容。
方案2(无需安装jq,用临时文件实现)
先把完整请求体写入临时文件,再传给curl,同样规避命令行参数过长问题:
# 生成临时文件存储请求体 temp_req=$(mktemp) # 写入JSON前半部分 cat > "$temp_req" <<EOF { "data": { "type": "attachments", "attributes": { "attachment": { "content": " EOF # 追加base64编码后的文件内容 base64 --wrap=0 data.txt >> "$temp_req" # 写入JSON后半部分 cat >> "$temp_req" <<EOF ", "file_name": "$FileName" } } } } EOF # 执行curl请求 curl -X POST https://Path/to/attachments \ -H 'content-type: application/vnd.api+json' \ -H 'x-api-key: KEY' \ -d @"$temp_req" # 删除临时文件 rm -f "$temp_req"
注意事项
- 如果文件名包含双引号、换行等特殊字符,优先使用方案1,jq会自动做转义处理,避免JSON格式错误。
- 两种方案均从根源规避了大内容作为命令行参数传递的逻辑,不会触发参数长度超限错误。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

