jq 错误,管道时的使用消息

jq 错误,管道时的使用消息

我什至不知道如何命名这个。因此,如果我jq在 json 对象上使用,它会引发错误。如果我使用cat该对象,则使用jq,它会以良好的格式输出 json。但是,如果我随后对其执行任何操作,无论是将其重定向、将其转发到其他内容,还是尝试将其抓取到变量中,它都会吐出使用文本。

da@nu:~$ jq dada1.json
jq: error: dada1/0 is not defined at <top-level>, line 1:
dada1.json
jq: 1 compile error
da@nu:~$ cat dada1.json|jq
{
  "output": somethingsomething
}
da@nu:~$ cat dada1.json |jq |head
jq - commandline JSON processor [version 1.5-1-a5b5cbe]
Usage: jq [options] <jq filter> [file...]
....
da@nu:~$ da1=$(cat dada1.json |jq)
jq - commandline JSON processor [version 1.5-1-a5b5cbe]
Usage: jq [options] <jq filter> [file...]
...
da@nu:~$ cat dada1.json |jq > dada2.txt
jq - commandline JSON processor [version 1.5-1-a5b5cbe]
Usage: jq [options] <jq filter> [file...]
....
da@nu:~$ cat dada1.json |jq 2> dada2.txt
jq - commandline JSON processor [version 1.5-1-a5b5cbe]
Usage: jq [options] <jq filter> [file...]
....
da@nu:~$ cat dada1.json |jq |tee -a dada2.txt
jq - commandline JSON processor [version 1.5-1-a5b5cbe]
Usage: jq [options] <jq filter> [file...]
....

我不知道为什么会发生这种情况:/而且我设置的变量是空的,并且没有任何内容被重定向到dada2.txt

编辑:不是修复或解释,但我可以通过这样做来避免这种情况jq '.' dada1.json,并且我可以操纵那里的输出。

答案1

真的,@glenn-jackman 的评论是正确的答案对于你的第一个例子,但我确信这会导致一个问题:为什么当你cat这样做时它会起作用,并且......它确实起作用了!从技术上讲,这是一个单独的问题,但老实说,这是解释的逻辑部分为什么恕我直言,您最初的尝试没有成功。

而且,公平地说,我写下了这个答案的大部分内容,然后才意识到我和评论中的其他人一样,忽略了cat dada1.json | jq | head, et 。等人。失败。

那么让我们从第一个例子的答案开始:

当您调用 as 时jq dada1.json,第一个非标志参数(不以 a 开头-)将被解析为过滤器,正如 @glenn-jackman 在评论中指出的那样。 jq认为你的文件名是过滤器。从评论中提到的手册页概要中应该可以明显看出这一点。

是的,正如您所发现的,在这种情况下正确的调用是jq '.' dada1.json,让它首先解析过滤器,然后解析命令行末尾的可选文件名。

那么当你cat使用它(即管道它)时会发生什么?据我所知,这实际上是不是记录在 help/man 中,但是这段jq代码发挥了作用:

 if (!program && (!isatty(STDOUT_FILENO) || !isatty(STDIN_FILENO)))
    program = ".";

据我所知,如果满足以下条件,则分配默认的“程序”(即“过滤器”):

  • 没有从参数列表中解析出现有的过滤器
  • STDIN 或 STDOUT 是管道

所以它基本上做了一个“智能回退”以允许仅使用| jq.

至于其余的示例,您可以在其中重定向输出它失败了,这对我(以及评论中的其他人)在jq版本 1.6(及更高版本)下有效。早期版本有一个问题带有重定向(感谢评论中的@fra-san)。我们猜测您正在运行旧版本。

例如在 1.6 上:

> cat dada1.json | jq | head
{
  "output": "somethingsomething"
}
> cat dada1.json |jq > dada2.txt
> cat dada2.txt
{
  "output": "somethingsomething"
}
> rm dada2.txt
> cat dada1.json |jq |tee -a dada2.txt
{
  "output": "somethingsomething"
}
> cat dada2.txt
{
  "output": "somethingsomething"
}

相关内容