这个命令通过管道将curl传递给jq有什么问题?

这个命令通过管道将curl传递给jq有什么问题?

我正在尝试为 BSD 编写的 bash 脚本可以在 Linux 上运行,以防相关。现在我在这条线上绊倒了:

json="$(sudo -u "${vpnUser}" -- curl --interface "${adaptorName}" --get --insecure --silent --show-error --fail --location --max-time "${curlMaxTime}" --data-urlencode "token=${authToken}" "https://${gatewayAddress}:19999/getSignature" | jq -Mre)"

我已经从脚本中回显了变量的值,它们看起来很好。然后我用值替换了变量。然后 jq 似乎抱怨语法错误(通用Usage:输出)和curl,我认为,说(23) Failed writing body。如果只是运行该命令,sudo -u ... | jq -Mre它会打印看起来像 JSON 文件的内容。

答案1

问题是jq1.6 之前的版本需要筛选跑步。最简单的过滤器是恒等过滤器,它产生与输入相同的输出。这在 中写为单个点jq

要使代码正常工作:

json=$( ... | jq -r -e . )

至于与 一起使用的选项jq

  • -M选项与相同--monochrome-output,只是请求非彩色输出。这是jq不写入终端时的默认设置,因此很可能会删除该选项。

  • -r选项与 相同--raw-output。当jq输出裸弦(不是包含字符串的 JSON 结构),字符串将被解码。这意味着输出的字符串不会被引用,并且将具有特殊的字符序列,例如\n,\t\"展开。该选项可以不是如果输入是jq一组需要解码的 JSON 编码字符串,则将被删除。

  • -e选项与 相同--exit-status。此选项使jq退出的退出状态反映最后评估的值。这意味着命令退出时带有失败如果最终结果是nullfalse。如果脚本在errexit激活 shell 选项的情况下运行,则此处的非零退出状态jq将终止脚本,这意味着在不了解有关命令所在脚本的更多信息的情况下也无法删除此选项。

我猜想jq这里的使用只是为了漂亮地打印curl结果。原作者可能只是从某个地方复制了这三个选项,而没有给予他们任何真正的思考(包含 表明了-M这一点),但同样有可能它们可能依赖于 的退出状态来jq终止脚本。

答案2

没关系!喝了一杯爱尔兰咖啡,研究了jq一下,我很好奇为什么作者会通过解析器传输输出,解析器基本上不会对数据做任何事情,只是将其格式化为更易读的多行​​输出。帮助后删除所有内容|

相关内容