为什么jq的--slurp参数无法同时处理普通文件与here-string?
根本原因
你的测试异常和jq无关,完全是Bash对here-string(<<<)的处理逻辑导致的:
<<<属于标准输入(stdin)重定向语法,不是命令行位置参数。不管你把它写在整行命令的任意位置(开头、中间、末尾),Bash最终只会把它的内容绑定到命令进程的stdin,不会把它当成传入jq的文件参数。- jq的输入规则为:如果命令行参数里指定了文件名,就优先读取所有指定文件的内容;只有未传入任何文件名参数时,才会从stdin读取输入。
对应测试场景解释
- 运行
jq --slurp add zero <<< '{"key":1}'时,命令行参数里指定了文件zero,jq只会读取zero的内容,stdin里的here-string内容直接被忽略,所以输出只有{"key":0}。 - 运行
jq --slurp add <<< '{"key":0,"anotherkey":2}' one时,命令行参数里指定了文件one,同样jq只会读取one的内容,stdin内容被忽略,输出只有{"key":1}。 - 单个here-string测试正常,是因为你没有给jq传入任何文件名参数,jq才会从stdin读取内容。
- 两个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
相关产品推荐
相关产品推荐

