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

为什么jq的--slurp参数无法同时处理普通文件与here-string?

根本原因

你的测试异常和jq无关,完全是Bash对here-string(<<<)的处理逻辑导致的:

  • <<< 属于标准输入(stdin)重定向语法,不是命令行位置参数。不管你把它写在整行命令的任意位置(开头、中间、末尾),Bash最终只会把它的内容绑定到命令进程的stdin,不会把它当成传入jq的文件参数。
  • jq的输入规则为:如果命令行参数里指定了文件名,就优先读取所有指定文件的内容;只有未传入任何文件名参数时,才会从stdin读取输入。

对应测试场景解释

  1. 运行 jq --slurp add zero <<< '{"key":1}' 时,命令行参数里指定了文件zero,jq只会读取zero的内容,stdin里的here-string内容直接被忽略,所以输出只有{"key":0}。
  2. 运行 jq --slurp add <<< '{"key":0,"anotherkey":2}' one 时,命令行参数里指定了文件one,同样jq只会读取one的内容,stdin内容被忽略,输出只有{"key":1}。
  3. 单个here-string测试正常,是因为你没有给jq传入任何文件名参数,jq才会从stdin读取内容。
  4. 两个here-string的测试结果存在误导:Bash中如果给一个命令绑定多个<<<重定向,只有最后一个会生效,前面的会被直接覆盖,stdin里最终只有最后一个here-string的内容,并非两个内容都被传入jq。

调试方法与正确写法

你可以通过简单命令验证重定向和参数的区别:

# 不管<<<写在什么位置,都不会变成echo的参数,输出永远是a b
echo a b <<< 'test'
<<< 'test' echo a b

如果要混合读取文件和stdin的内容,给jq传入-作为stdin的占位文件名即可:

# 先读zero文件,再读stdin的here-string内容,合并结果正常
jq --slurp add zero - <<< '{"key":1}'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:30:04