什么时候可以省略jq中的dot filter?

When it is allowed to omit the dot filter in jq?

不懂,什么时候允许省略点表达式。

可以将每一行原始输入转换成一个 JSON 字符串:

$ echo -e "a\nb" | jq -Rc . 
"a"
"b"

在那个例子中,当缺少点表达式时,它没有区别:

$ echo -e "a\nb" | jq -Rc 
"a"
"b"

接下来我可以读取第一个 jq 的输出并将其放入数组中:

$ echo -e "a\nb" | jq -Rc . | jq -sc .
["a","b"]

这里也没有区别,当我省略点表达式时:

$ echo -e "a\nb" | jq -Rc . | jq -sc  
["a","b"]

但是当我省略两个点表达式时,我得到一个使用错误和一个空数组作为结果:

$ echo -e "a\nb" | jq -Rc | jq -sc 
jq - commandline JSON processor [version 1.5]
Usage: jq [options] <jq filter> [file...]
...
[]

为什么?

答案在文中

Usage: jq [options] <jq filter> [file...]

那么过滤器应该是强制性的,过滤器接受一个输入并产生一个输出,但在很多时候你不需要产生一个输出而只是想要打印结果所以默认是 .(见issue相信在1.5中引入,之前你必须要包含过滤器)

所以如果 . 是默认过滤应该是一样的,不幸的是管道是如何读取标准输入和粗壮的。您可以在 GitHub 问题

中阅读详细信息

Maybe we should print the usage message only when the program is empty, and stdin and stdout are both terminals? That is, assume . when stdin is not a terminal or when stdout is not a terminal.

所以规则是:

  • 如果你想成为完美主义者,请始终使用过滤器,即使 . 是你想要的过滤器
  • 如果你想让你的命令的结果成为另一个管道的输入,你必须指明过滤器,如果你只是想让同样的结果作为下一个命令的输入。

一样

echo -e "a\nb" | jq -Rc > test.txt 会产生错误,但 echo -e "a\nb" | jq -Rc . > test.txt 会将命令的结果写入文件

在直接回答问题之前,我想澄清一下:

  1. 明确指定过滤器总是可以接受的。
  2. 某些版本的 jq 需要明确指定过滤器。
  3. 不同版本的 jq 在没有显式过滤器的情况下表现不同。

指导 jq 在智能地解释过滤器缺失方面的发展的主要思想是,如果在 STDIN 上有一些东西要阅读,并且没有明确指定过滤器,并且看起来你的意思是 .,那么假设你的意思是 ..

那么,问题的答案是问题中提到的令人费解的行为是特定版本的 jq 中的错误。

(或者,如果您愿意,这种令人费解的行为反映了当开发人员试图赋予软件读心能力时出现的困难。)

顺便说一句,错误已经修复:

$ jq --version
jq-1.5rc2-150-g1740fd0

$ echo -e "a\nb" | jq -Rc | jq -sc 
["a","b"]