【问题标题】:/usr/bin/jq: Argument list too long error bash/usr/bin/jq:参数列表太长错误bash
【发布时间】:2020-05-08 06:57:58
【问题描述】:

我想用较大的 swagger.json 文件内容替换示例 json 中的值,但它太大了。

Error:
/usr/bin/jq: Argument list too long error bash 

花了几天时间解决了这个问题,但在这里无法确定问题所在。 这是示例 json 文件:

{
   "name": "",
   "description": "",
   "context": "",
   "version": "",
   "provider": "cbs",
   "apiDefinition": "",
   "wsdlUri": null,
   "responseCaching": "Disabled",
   "cacheTimeout": 300,
   "destinationStatsEnabled": false,
   "isDefaultVersion": true,
   "transport":    [
      "http",
      "https"
   ],
   "tags": ["PROVIDER_","MIFE"],
   "tiers": ["Unlimited","Default","Silver","Subscription","Gold","Premium","Bronze"],
   "maxTps":    {
      "sandbox": 5000,
      "production": 1000
   },
   "visibility": "PUBLIC",
   "visibleRoles": [],
   "endpointConfig": "",
   "endpointSecurity":    {
      "username": "user",
      "type": "basic",
      "password": "pass"
   },
   "gatewayEnvironments": "Production and Sandbox",
   "sequences": [],
   "subscriptionAvailability": null,
   "subscriptionAvailableTenants": [],
   "businessInformation":    {
      "businessOwnerEmail": "BUSINESSOWNEREMAIL_",
      "technicalOwnerEmail": "TECHNICALOWNEREMAIL_",
      "technicalOwner": "TECHNICALOWNER_",
      "businessOwner": "BUSINESSOWNER_"
   },
   "corsConfiguration":    {
      "accessControlAllowOrigins": ["*"],
      "accessControlAllowHeaders":       [
         "authorization",
         "Access-Control-Allow-Origin",
         "Content-Type",
         "SOAPAction"
      ],
      "accessControlAllowMethods":       [
         "GET",
         "PUT",
         "POST",
         "DELETE",
         "PATCH",
         "OPTIONS"
      ],
      "accessControlAllowCredentials": false,
      "corsConfigurationEnabled": false
   }
}

这是我使用的命令,它给了我一个错误,因为我的参数太大。

swagger = $(cat swagger.json)

jq -r --arg swagger "$swagger" '.apiDefinition = $swagger' <<<"$json"

谁能帮忙!

swagger = $(cat swagger.json)

【问题讨论】:

  • 你为什么编辑掉脚本的一部分?可以回帖吗?并向我们​​展示如何重现该问题?同时发布您正在尝试的jq 版本。
  • 我想用 swagger.json 值替换 apiDefinition 关键字值。
  • jq - 命令行 JSON 处理器 [版本 1.5-1-a5b5cbe]
  • 如果文件太长,请将其发布到外部文件仓库并在此处链接
  • 对不起!不能分享:(

标签: bash jq


【解决方案1】:

从你的例子:

jq -r --arg swagger "$swagger" '.apiDefinition = $swagger' <<<"$json"

我假设您希望输出生成一个带有键“apiDefinition”的 JSON 对象,并将其值设置为 swagger.json 的内容(其中包含有效的 JSON)。

在这种情况下这是可行的:

jq -n --slurpfile swagger swagger.json '{"apiDefintion": $swagger[0]}'

结果输出的前 10 行:

{
  "apiDefintion": [
    {
      "id": 1,
      "first_name": "Samson",
      "last_name": "Wandrack",
      "email": "swandrack0@hibu.com",
      "gender": "Male",
      "ip_address": "122.171.218.251"
    },
  • 在这种情况下需要 -n,以使用命令行上的 JSON 作为输入 JSON,而不是从标准输入或文件中读取它。
  • --slurpfile 将 swagger.json 的内容作为数组放入变量 $swagger 中。
  • -r 不是必需的,因为它没有任何效果,除非输出只是字符串(并且它的原始输出使其无效 JSON)。
  • $swagger[0] 用于仅包含 slurped 数组的第一项。

来自https://stedolan.github.io/jq/manual/的文档:

--null-input/-n:

根本不读取任何输入!相反,过滤器使用 null 作为输入运行一次。这在将 jq 用作简单的计算器或从头构造 JSON 数据时很有用。

--slurpfile 变量名文件名:

此选项读取命名文件中的所有 JSON 文本,并将解析的 JSON 值的数组绑定到给定的全局变量。如果你用 --slurpfile foo bar 运行 jq,那么 $foo 在程序中是可用的并且有一个数组,它的元素对应于名为 bar 的文件中的文本。

--原始输出/-r:

使用此选项,如果过滤器的结果是字符串,那么它将直接写入标准输出,而不是格式化为带引号的 JSON 字符串。这对于让 jq 过滤器与非基于 JSON 的系统通信很有用。

【讨论】:

    【解决方案2】:

    Q 没有明确说明$swagger 是如何设置的,但似乎与其使用--arg swagger $swagger,不如使用面向文件的命令行选项之一,可能类似于以下内容:

    --argfile swagger swagger.json
    

    有很多替代方案,但要在这里明智地探索这些,最好提供至少一个完整但非常微小的示例。 (示例不必说明“Argument list too long”错误!)

    警告

    如果您担心--argfile 选项已被弃用,那么如果您的jq 有它,请务必使用--slurpfile,但请注意后一个选项将文件内容包装到JSON 数组中,所以您必须考虑到这一点。

    这些和其他选项都在https://stedolan.github.io/jq/manual/的官方文档中简洁地介绍了

    【讨论】:

    • swagger = $(cat swagger.json)
    • root@mife-kubernetes-master:/home/svradmin/jsontest# jq -r --slurpfile swagger "$swagger" '.apiDefinition = $swagger'
    猜你喜欢
    • 2021-03-28
    • 2011-03-12
    • 1970-01-01
    • 2014-08-30
    • 2015-04-27
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    相关资源
    最近更新 更多