【问题标题】:jq with pipe error. Without pipe not errorjq 有管道错误。没有管道不会出错
【发布时间】:2021-02-09 09:50:16
【问题描述】:

我正在尝试调用一个 api,并在同一行中使用 jq 解析其输出。 如果我在一行中完成所有操作,则会出现错误:

bash-4.2$ call_api -s "job=work_1*&status=Executing"  | $PATH_API/jq '.statuses[].name // empty' --raw-output
parse error: Unfinished string at EOF at line 2301, column 61

但如果我将 api 的输出重定向到一个文件,然后将 jq 应用于该文件,它不会引发任何错误:

bash-4.2$ call_api -s "job=work_1*&status=Executing"  > /tmp/kk
bash-4.2$  $PATH_API/jq '.statuses[].name // empty' --raw-output /tmp/kk
work_1_002103ALLGDC
work_1_000049EVEFIN
work_1_002038ALF003

你知道为什么吗?是否有可能修复它可以在一行中实现它?

【问题讨论】:

  • 试试call_api -s "job=work_1*&status=Executing" | tee /tmp/kk >/dev/null(删除/tmp/kk后是否还存在),看看$PATH_API/jq '.statuses[].name // empty' --raw-output /tmp/kk是否也失败,如果是,检查/tmp/kk的内容,看看有什么问题。有些程序在输出管道时表现不同,这可能是您的问题
  • 另请注意,“在一条线上做事”很少是一个富有成效的目标,而且往往会适得其反,但如果这对你来说真的很重要,你总是可以选择用@分隔命令987654328@ 而不是换行

标签: json jq


【解决方案1】:

这可能是 call_api 本身的问题 - 因为它没有定义它是什么。一些程序(例如 curl 等)的行为会根据其输出的位置而略有不同。通常,最大的区别在于 tty 和 not-a-tty,但您可能会发现管道文件和常规文件之间的差异。 jq的行为应该没有本质上的差异。

richard@sophia:~/cc/dpbuilder (bug/T-10571) $ jq -r '.[]' < fred.json 
Hello
World
richard@sophia:~/cc/dpbuilder (bug/T-10571) $ jq -r '.[]' fred.json 
Hello
World
richard@sophia:~/cc/dpbuilder (bug/T-10571) $ cat fred.json | jq -r '.[]'
Hello
World
richard@sophia:~/cc/dpbuilder (bug/T-10571) $ 

还要检查输出的大小 - 就管道输出而言,您可能会遇到限制。尤其是大于64k吗?

【讨论】:

  • 其实jq的行为会根据输入的不同而有所不同。如果标准输入被重定向到一个文件,例如过滤器就不是必需的。请参阅:github.com/stedolan/jq/issues/1110 如果输出被重定向,它的行为(微妙)不同,我不会感到惊讶。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 2018-02-09
  • 2018-06-01
  • 2018-05-11
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多