如何在重定向输出时抑制 cUrl 的进度计?

如何在重定向输出时抑制 cUrl 的进度计?

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. 抑制它的最巧妙方法是什么?

答案1

尝试这个:

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

这将抑制进度计,发送stdout到并将(输出)/dev/null重定向到。stderr-vstdout

答案2

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(在本例中为文件)。

答案3

根据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报告文件描述符是否引用终端。

相关内容