我似乎无法让jq在shell管道中表现得“正常”。例如:

$ curl -s https://api.github.com/users/octocat/repos | jq | cat

结果在jq中只是打印出它的帮助文本*。如果我试图将jq的输出重定向到一个文件,也会发生同样的事情:

$ curl -s https://api.github.com/users/octocat/repos | jq > /tmp/stuff.json

如果jq确定不是由tty运行,那么它是否会故意退出?如何防止这种行为,以便在管道中使用jq ?

编辑:在jq的最新版本中,这似乎不再是一个问题。我现在有了jq-1.6,上面的示例按预期工作。


*(我意识到这个例子中无用地使用了cat;这只是为了说明的目的)


当前回答

我发现自己经常做的一个用例是“如何构造JSON数据以提供给其他shell命令,例如curl?”我这样做的方法是使用——null-input/-n选项:

不要阅读任何输入!相反,过滤器使用null作为输入运行一次。这在使用jq作为简单的计算器或从头构造JSON数据时非常有用。

还有一个将它传递给curl的例子:

jq -n '{key: "value"}' | curl -d @- \
  --url 'https://some.url.com' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json'

其他回答

我发现自己经常做的一个用例是“如何构造JSON数据以提供给其他shell命令,例如curl?”我这样做的方法是使用——null-input/-n选项:

不要阅读任何输入!相反,过滤器使用null作为输入运行一次。这在使用jq作为简单的计算器或从头构造JSON数据时非常有用。

还有一个将它传递给curl的例子:

jq -n '{key: "value"}' | curl -d @- \
  --url 'https://some.url.com' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json'

您需要提供一个过滤器作为参数。除了jq默认提供的漂亮打印之外,要未经修改地传递JSON,请使用标识过滤器:

curl -s https://api.github.com/users/octocat/repos | jq '.' | cat