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

Bash中Curl请求保留换行符:无需临时文件的解决方案

解决不带临时文件传递带换行符的curl payload问题

你的需求是避免写入临时文件,直接传递包含换行符的payload给curl,问题出在没有沿用原脚本的--data-binary参数,以及部分传递方式的语法/逻辑错误。以下是几种可行的解决方案:

方案1:直接用--data-binary传递变量

原脚本用--data-binary @tmp.json读取文件,它会严格保留文件中的所有字符(包括换行符)。直接把变量传给--data-binary即可,不需要临时文件:

payload='{"index":{}}'$'\n''{"name":"Samuel"}'
curl -X POST "http://my.api.com/" \
  -H "Content-Type: application/json" \
  --data-binary "$payload"

这个方法最直接,变量中的换行符会被完整保留,和写入文件的效果完全一致。

方案2:通过标准输入传递(Here字符串)

用@-让curl读取标准输入,配合bash的Here字符串<<<传递payload变量:

payload='{"index":{}}'$'\n''{"name":"Samuel"}'
curl -X POST "http://my.api.com/" \
  -H "Content-Type: application/json" \
  --data-binary @- <<< "$payload"

<<< "$payload"会把变量内容(包含换行)直接传给curl的标准输入,--data-binary @-负责读取并发送,同样保留原始换行。

方案3:进程替换(避免额外换行)

如果用进程替换,注意要给echo加-n参数,防止echo自动追加额外的换行符(这会导致payload多一行空内容,触发API语法错误):

payload='{"index":{}}'$'\n''{"name":"Samuel"}'
curl -X POST "http://my.api.com/" \
  -H "Content-Type: application/json" \
  --data-binary @<(echo -n "$payload")

为什么之前的尝试失败?

  • 用--data "$payload":--data会自动对数据做URL编码处理,包括将换行符转换为%0D%0A,破坏了bulk API要求的每行独立JSON的格式。
  • 用--data @- << echo "$payload":语法错误,Here文档的正确写法是<<< "$payload"或者<< EOF加内容,你这种写法会把echo "$payload"当作字符串传递,而非执行命令输出。
  • 用--data \$payload``:命令替换会把变量中的换行符和空格当作分隔符,将payload拆分成多个参数,完全破坏了JSON结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:22:37