为什么 jq 有时需要过滤表达式,有时不需要?

Why does jq sometimes require a filter expression, and sometimes not?

我有一些未格式化的 JSON 文件。我想用 jq 格式化它们并通过 less 查看格式化输出:

cat *.json | jq | less

但是没用。只是显示jq的帮助。

O.K., jq 需要一个过滤器,最小一个 .,但是...

cat *.json | jq

适合我。

有什么区别?这是一个 Bash 错误吗,看到解析命令行是 shell 的任务?为什么这只发生在 jq 上?

如果

jq 检测到它的输出流是一个终端,它会做一些不同的事情。一方面,它对其输出进行颜色编码(除非您明确关闭该选项)。但与这个问题更相关的是,对于 1.5 版,如果它检测到它的输出流是一个终端而它的输入流不是一个终端并且根本没有非选项命令行参数,它假定你打算使用过滤器 ..

这就是您键入 cat *.json | jq 时发生的情况。在这种情况下,jq 的输入流是一个管道(来自 cat 命令),但它的输出流是终端。所以它假定默认过滤器 ..

但是当您通过 less 传输 jq 的输出时,jq 的输出流不再是终端。现在它是一个管道(连接到 less 进程)。所以没有插入自动过滤器.jq抱怨没有提供过滤器。

但是,如果您升级到 v1.6,您会发现行为发生了变化。在 v1.6 中,没有任何过滤器的调用将被调整为 . 除非 输入流和输出流都是终端。所以如果你升级,你会发现 cat *.json | jq | less 的工作方式与 cat *.json | jq 大致相同,只是输出是彩色的,当然,没有分页。

顺便说一句,如果您想使用 less 查看彩色输出(并且您使用的是 Gnu less),那么您可以使用命令:

cat *.json | jq . -C | less -R   # The . is not necessary with v1.6