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

如何将curl -i的HTTP响应头输出重定向至标准错误(stderr)?

嘿,这个场景我太熟悉了!每次用curl -i拿响应头,结果响应体混着头一起给jq处理,直接报错,烦得不行😅。给你几个实用的解决方案,按需选:

方法1:用curl -D直接把响应头输出到stderr(最推荐)

curl本身就有专门输出响应头的参数-D(--dump-header),我们可以指定把头部输出到/dev/stderr(标准错误流),这样响应体就乖乖留在stdout给jq处理:

curl -D /dev/stderr http://website.com | jq .

原理很简单:-D后面跟的是保存响应头的目标,/dev/stderr就是系统的标准错误设备,这样头部会被打印到终端的错误输出区域,不会和响应体混进jq的输入里。

方法2:用awk分离头部和响应体(兼容-i的场景)

如果你非要保留-i参数(比如习惯了它的输出格式),可以用awk来切割HTTP响应的头部和体部(它们之间用空行分隔),把头发到stderr,体传给jq:

curl -i http://website.com | awk '
  BEGIN { RS = "\r\n\r\n"; ORS = "" }
  {
    print $0 > "/dev/stderr"  # 输出头部到stderr
    getline                   # 读取响应体部分
    print $0                  # 输出响应体到stdout给jq
  }
' | jq .

这个脚本会精准识别HTTP响应的分隔符,确保头部和体部分开处理。

方法3:用curl -w自定义输出头部字段到stderr

如果只需要特定的响应头字段(比如状态码、Content-Type),可以用-w(--write-out)参数自定义输出,同时把它重定向到stderr:

curl -s http://website.com -w "HTTP Status: %{http_code}\nContent-Type: %{content_type}\n" >&2 | jq .

这里-s是静默模式(关掉curl的进度条),-w后面的字符串是自定义的输出内容,>&2把这部分输出转到stderr,响应体还是留在stdout给jq。

个人最推荐方法1,完全利用curl原生参数,简洁又可靠,不容易出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:53:57