Bash JQ仅在重定向stdout时给出用法错误

Bash JQ仅在重定向stdout时给出用法错误,bash,curl,jq,Bash,Curl,Jq,我有一个卷曲命令 curl -H "Accept: application/json" https://icanhazdadjoke.com/ 它返回JSON(注意:我选择这个api是因为它没有身份验证,所以每个人都可以帮助测试,它返回一个格式化的JSON,但大多数api返回一个没有格式化的平面JSON…一行) 当我向JQ发送管道时,JQ的响应与预期一致。我通过管道连接到jq以确保我有一个格式化的可读json curl -H "Accept: application/json" https:

我有一个卷曲命令

 curl -H "Accept: application/json" https://icanhazdadjoke.com/
它返回JSON(注意:我选择这个api是因为它没有身份验证,所以每个人都可以帮助测试,它返回一个格式化的JSON,但大多数api返回一个没有格式化的平面JSON…一行)

当我向JQ发送管道时,JQ的响应与预期一致。我通过管道连接到jq以确保我有一个格式化的可读json

curl -H "Accept: application/json" https://icanhazdadjoke.com/ | jq
返回

%Total%接收到%x平均速度时间电流
数据加载上载总左速度
100   110  100   110    0     0    320      0 --:--:-- --:--:-- --:--:--   321
{
“id”:“Ncaylene”,
“笑话”:“我怕日历,日子已经不多了。”,
“地位”:200
}
但是当我将JQ的输出通过管道传输到文本文件时(我希望保存一个格式化版本以便于可读,而不是简单的无格式json),我会得到一个错误

curl -H "Accept: application/json" https://icanhazdadjoke.com/ | jq > file.txt
返回

jq-命令行JSON处理器[版本1.5]
用法:jq[选项][文件…]
jq是一个处理JSON输入的工具,应用
为其JSON文本输入提供过滤器,并生成
在标准输出上以JSON格式筛选结果。
最简单的过滤器是.,它是标识过滤器,
未经修改地将jq的输入复制到其输出(除了
格式)。
有关更高级的过滤器,请参阅jq(1)手册页(“man jq”)
和/或https://stedolan.github.io/jq
其中一些选择包括:
-c紧凑而不是漂亮的打印输出;
-n使用'null'作为单个输入值;
-e根据输出设置退出状态代码;
-s读取(slurp)数组中的所有输入;对其应用过滤器;
-r输出原始字符串,而不是JSON文本;
-R读取原始字符串,而不是JSON文本;
-C着色JSON;
-M单色(不着色JSON);
-S输出上对象的排序键;
--制表符使用制表符进行缩进;
--arg a v将变量$a设置为值;
--argjson a v将变量$a设置为JSON值;
--slurpfile将变量$a设置为从中读取的JSON文本数组;
有关更多选项,请参见手册页。
%总接收百分比%x平均速度时间电流
数据加载上载总左速度
100   141  100   141    0     0    317      0 --:--:-- --:--:-- --:--:--   316
(23)写作主体不合格

如果希望
jq
格式化它作为输入获得的相同JSON,请将
作为脚本传递给它运行:

curl -H "Accept: application/json" https://icanhazdadjoke.com/ | jq . > file.txt
发件人:

标识:

最简单的过滤器是
。这是一个过滤器,它接受其输入并将其作为输出生成不变的内容。也就是说,这是标识运算符

由于jq默认情况下会打印所有输出,因此这个简单的程序可以作为格式化JSON输出的有用方法,例如,
curl


这就是说,
icanhazdadjoke
的输出实际上不会作为一行返回。你在问题中把它显示为几行,当我自己运行它时,我得到了几行(已经很好地打印了)。是的,如果你阅读了我问题的注释部分,我说这个API确实返回了很好的打印。我正在开发一个经过身份验证的api,它没有,没有经过身份验证的api更适合stackoverflowGotcha。我很感激你努力制造一台别人可以使用的复制机。为了将来的注意,它们都是无广告的粘贴箱,具有文档化的
curl
-友好界面,通过这些界面,人们可以通过管道传输文件,让人们获得完全相同的位;对于此类示例非常有用。非常确定的是,它也有一个原始接口,但必须查看(而ix/sprunge在前面记录了它们的接口)。如果对
jq
的调用的标准输出是一个终端,那么它可能会忽略过滤器,这一事实似乎是未记录的。非常好!!您能否提供文档链接或解释
does@ktgold您自己已经完成了,请检查问题中的用法消息;)请注意,JSON解析器在
看到输入之前就开始咀嚼输入,因此
jq.
不能始终可靠地用作漂亮的打印机。
curl -H "Accept: application/json" https://icanhazdadjoke.com/ | jq . > file.txt