如何将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
相关产品推荐
相关产品推荐

