管道输送时 curl 如何打印到终端

管道输送时 curl 如何打印到终端

当我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 时,您将获得两个输出:

  1. 本身的状态curl
  2. 该 URL 的内容。

Curl 应该使用一种方法来分别显示这两者,否则处理实际输出(URL 的内容)会很困难,并且我最终会得到不必要的内容(curl 的状态)。

因此它使用stderr它的状态和stdout内容。

使用>您正在将 URL 的内容(stdout)重定向到/dev/null,您实际上应该使用:2> /dev/null

此外,如果您想将它们都添加到下一个命令中:

curl url |&  command

如果您只希望将内容传输到下一个命令而不查看状态:

curl 2> /dev/null | command

相关内容