【问题标题】:-bash: /bin/jq: Argument list too long-bash: /bin/jq: 参数列表太长
【发布时间】:2021-03-28 17:06:58
【问题描述】:

以下 2 个 jq 语句读取大型 json 文件并复制到另一个 json 文件。但是此语句会引发“参数太长”错误。这对于较小的 json 文件来说非常好。

$ apiDefinitionString=`jq -r '. | tojson' api.json`
$ jq --arg definition "$apiDefinitionString" '.apiDefinition = $definition' api-new.json > api-spec.json

我尝试用 ----slurpfile 替换 --arg 以及在另一个线程1 中推荐的相同错误。

我还有其他选择来解决这个 Jq 问题吗?这是Jq限制吗?提前致谢。

【问题讨论】:

  • 简单地用 --slurpfile 替换 --arg 没有工作的机会。请更严格地遵循minimal reproducible example 指南。 $apiDefinitionString 的值是多少?您在使用 --slurpfile 时究竟尝试了什么?你看过jq手册对--slurpfile的解释吗?
  • @peak 如果输出变量大小为 204800 或更大,我也会遇到同样的错误。我在做什么,我正在创建一个各种大小的 var(输出),然后将其插入到这样的 json 对象中 #在这里创建一个所需大小的 var 200Kb output=$(tr -dc A-Za-z0-9 new_file.json -bash: /bin/jq: Argument list too long 当我使用各种大小的变量时,有什么建议可以解决这个问题吗?
  • @PrashantPathak - 您是否尝试过我的 A 中给出的方法来解决这个问题?
  • @peak 在您的回答中,我看到一个文件被读入一个变量,然后该变量作为 apiDefinition 数组下的 json 文件中的一个文件传递,并将其重定向到一个文件。就我而言,我正在创建一个变量并从标准输出流中为其分配随机大小的字符串,然后尝试将 var 插入到 json key:val 中。无法执行您在我的场景中给出的建议。
  • @PrashantPathak - 也许你误解了这个例子。您可能想使用sponge

标签: command-line-arguments jq


【解决方案1】:

--slurpfile 选项与--arg 选项非常不同。一方面,它期望提供一个文件(或文件句柄);此外,它将文件的内容包装到一个数组中。

即使 --argfile 选项已被弃用,我还是建议您先尝试以最简单的方式使用它,例如首先将你的 shell 变量的内容写入一个文件,可能是这样的:

jq -r 'tojson' api.json > out.tmp
jq --argfile definition out.tmp '.apiDefinition = $definition' api-new.json > api-spec.json

当你得到这个工作后,你可以转向更好的变化。

更好的是,您应该能够将两个对 jq 的调用合并为一个:

jq --argfile definition api.json '.apiDefinition = ($definition|tojson)' api-new.json > api-spec.json

【讨论】:

  • 使用 bash(但不是 POSIX shell),可以避免第一个 sn-p 中的临时文件 using<( ):jq --argfile definition <( jq -r 'tojson' api.json ) ...
【解决方案2】:

Argument list too long is a system error。论据与环境 大小受所有类 Unix 内核的限制。你超过了那个尺寸。 使用 -f 传递超大程序。 (但要注意 jq 函数 主体和顶级 jq 程序的编译大小限制为 每个 64K 代码单元。)

【讨论】:

  • 这个引用几乎无关紧要,因为 $apiDefinitionString 显然不是 jq 程序。
猜你喜欢
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2020-05-26
  • 1970-01-01
  • 2014-08-30
  • 2015-04-27
  • 2019-02-22
相关资源
最近更新 更多