cURL:重定向时如何抑制奇怪的输出?


67

我正在尝试stderr仅从bash shell 打印cURL请求(发送到)的详细部分。

但是当我这样重定向时stdout

curl -v http://somehost/somepage > /dev/null

某种结果表出现在输出的中间,显示为stderr

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

紧随其后的是:

{ [data not shown]
118   592    0   592    0     0  15714      0 --:--:-- --:--:-- --:--:-- 25739

这使得响应头的可读性降低。

不重定向时看不到此文本。


查看效果的另一种方法:

表格未出现:

curl -v http://somehost/somepage 2>&1

表格出现:

curl -v http://somehost/somepage 2>&1 | cat

1)为什么只有某些类型的重定向会显示出来?

2)最简单的抑制方法是什么?

谢谢

Answers:


60

尝试这个:

curl -vs -o /dev/null http://somehost/somepage 2>&1

这将抑制进度表,发送stdout/dev/null并重定向stderr-v输出)到stdout


32
谢谢,-s是关键!
伊恩·麦金农

6
@IanMackinnon请注意,有-s但没有-v您将不会看到诸如连接失败之类的错误。为此,您还应该在mhoydis的答案中添加-S(或--show-error)。
Artyom 2014年

但是为什么进度栏仅在重定向时出现在第一位?在将输出curl传递到时遇到了同样的问题jq。如果没有管道jq,则没有进度条,那么当管道到管道时,jq我必须返回并添加-s
sixty4bit

@ sixty4bit:这是开发人员做出的设计选择。该程序可以检测出何时STDOUT不是tty。当不通过管道传输输出时,您不希望进度信息散布在正常的输出中,您可以看到正常的输出并对其有所了解。重定向或管道输出后,您将看不到它,因此无法衡量进度-除非进度条处于打开状态。
丹尼斯·威廉姆森

23
curl --fail --silent --show-error http://www.example.com/ > /dev/null

这将取消状态对话框,但否则将错误输出到STDERR。

user@host:~# curl http://www.yahoo.com > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  254k    0  254k    0     0   403k      0 --:--:-- --:--:-- --:--:--  424k

重定向时,上面的输出状态表。

user@host:~# curl --fail --silent --show-error http://www.yahoo.com > /dev/null

上面的代码在重定向时会抑制状态表,但是错误仍然会归结到STDERR。

user@host:~# curl --fail --silent --show-error http://www.errorexample.com > /dev/null
curl: (6) Couldn't resolve host 'www.errorexample.com'

以上是STDERR错误的示例。

user@host:~# curl -v --fail --silent --show-error http://www.errorexample.com > ~/output.txt 2>&1
user@host:~# cat ~/output.txt 
* getaddrinfo(3) failed for www.errorexample.com:80
* Couldn't resolve host 'www.errorexample.com'
* Closing connection #0
curl: (6) Couldn't resolve host 'www.errorexample.com'

只需在末尾添加2>&1,即可将STDERR重定向到STDOUT(在这种情况下,重定向到文件)。


5

根据man curl

-s, --silent : Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.

用法示例:

curl -s 'http://www.google.com'

或者如果您想将HTTP-BODY捕获到bash中的变量中

BODY=$( curl -s 'http://www.google.com' )
echo $BODY

您可以使用-s--silent互换使用。


4

关于问题1(如何知道重定向输出时,cURL 如何知道显示表),我没有意识到程序可以告诉其输出是定向的,但是在POSIX系统上似乎有一个函数isatty可以报​​告是否文件描述符是指终端。


2
这是Bash片段:[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
丹尼斯·威廉姆森

2

1)为什么只有某些类型的重定向会显示出来?

从curl手册页

如果要使用HTTP POST或PUT请求的进度表,则需要使用shell重定向(>),-o [file]或类似方法将响应输出重定向到文件。

curl必须使用isatty确定重定向,并在重定向到文件或Shell管道时打印进度表。

2)最简单的抑制方法是什么?

从curl手册页

-s,--silent

静音或安静模式。不要显示进度表或错误消息。使Curl静音。除非您将其重定向,否则它仍将输出您要求的数据,甚至可能输出到终端/标准输出。


1

要将真正的错误消息放在某处,您应该将strerr写入日志文件。像这样:

curl  "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.