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
尝试这个:
curl -vs -o /dev/null http://somehost/somepage 2>&1
这将抑制进度计,发送stdout
到并将(输出)/dev/null
重定向到。stderr
-v
stdout
答案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
报告文件描述符是否引用终端。