当我curl
将文件传输到文件或其他命令时,我会在终端中看到输出。我不确定这是怎么发生的,因为管道应该从 curl 中获取所有输出,对吗?
例如:
$ curl http://www.archive.org/stream/Pi_to_100000000_places/pi.txt > /dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 129M 0 129M 0 0 22.5M 0 --:--:-- 0:00:05 --:--:-- 24.7M
编辑
我像这样使用 curl:
curl http://www.archive.org/stream/Pi_to_100000000_places/pi.txt | some_other_command > some_file
我不想将状态通过管道传输到 some_other_command,我只是想知道它如何能够显示状态。但是,显示如何重定向添加到答案中的两个流,所以不要删除它。
答案1
通常有两种输出流:标准输出和标准错误。实际上,在终端中运行时,两者都会将数据发送到终端。>
仅重定向标准输出,而 curl 将进度数据打印到标准错误。要抑制两者,请使用以下之一:
curl ... > /dev/null 2>&1
curl ... &> /dev/null # bash's combined redirection operator
curl -s ... # -s, --silent: Silent or quiet mode. Don't show progress meter or error messages.
要将两者都发送到管道:
curl ... 2>&1 | ...
curl |& ... # bash's combined pipe
除非使用|&
或&>
运算符,否则所有流都会被独立重定向。
另请参阅:
答案2
当您使用curl
打开 URL 时,您将获得两个输出:
- 本身的状态
curl
。 - 该 URL 的内容。
Curl 应该使用一种方法来分别显示这两者,否则处理实际输出(URL 的内容)会很困难,并且我最终会得到不必要的内容(curl 的状态)。
因此它使用stderr
它的状态和stdout
内容。
使用>
您正在将 URL 的内容(stdout)重定向到/dev/null
,您实际上应该使用:2> /dev/null
。
此外,如果您想将它们都添加到下一个命令中:
curl url |& command
如果您只希望将内容传输到下一个命令而不查看状态:
curl 2> /dev/null | command