如何使用curl -w 选项将输出重定向到stdout 的不同文件描述符,以避免将其附加到curl 响应的末尾?

如何使用curl -w 选项将输出重定向到stdout 的不同文件描述符,以避免将其附加到curl 响应的末尾?

我想要使​​用curl操作的下载速度和总时间curl -w。如果我跑

curl example.com -w '%{speed_download} %{time_total}'

标准输出是

<!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> body { background-color: #f0f0f2; margin: 0; padding: 0; font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } div { width: 600px; margin: 5em auto; padding: 2em; background-color: #fdfdff; border-radius: 0.5em; box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02); } a:link, a:visited { color: #38488f; text-decoration: none; } @media (max-width: 700px) { div { margin: 0 auto; width: auto; } } </style> </head> <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html> 2861.000 0.439478

speed_download 和 time_total 附加到标准输出。因此,如果我不使用该选项,我可以提取卷曲响应,-w如下所示:

CURL_RESPONSE=$(curl example.com -w '%{speed_download} %{time_total}')
echo $CURL_RESPONSE | grep -oP ".*(?= ([0-9]+\.[0-9]+ [0-9]+\.[0-9]+$))"

并类似地得到speed_downloadtime_total

echo $CURL_RESPONSE | grep -oP "([0-9]+\.[0-9]+ [0-9]+\.[0-9]+$)"

我想避免使用这种方法并将输出重定向-w '%{speed_download} %{time_total}'到不同的文件描述符,例如 STDERR 并保留 STDOUT 而不使用这些。在本文档中https://www.mit.edu/afs.new/sipb/user/ssen/src/curl-7.11.1/docs/curl.html它说:

-w/--写出

定义完成并成功操作后显示的内容。格式是一个字符串,可以包含与任意数量的变量混合的纯文本。该字符串可以指定为“string”,要从特定文件中读取,您可以将其指定为“@filename”,并告诉curl从标准输入中读取格式,您可以编写“@-”。

我们可以读取从文件中写入字符串的格式,但是有没有办法控制显示的内容与未使用 -w 的curl 的常规 STDOUT 分开重定向到哪里?

答案1

根据说明书(man curl):

-w, --写出

……

所有变量都指定为 %{variable_name},要输出正常的 %,只需将它们写为 %% 即可。您可以使用 \n 输出换行符,使用 \r 输出回车符,使用 \t 输出制表符空格。输出将写入标准输出,但可以使用 %{stderr} 将其切换为标准错误。

所以你可以使用下一个curl命令来获取speed_downloadand time_total

curl example.com --silent -w '%{stderr} %{speed_download} %{time_total}' 1> /dev/null

如果您想获得另一个输出(html),您可以重定向文件描述符1stdout文件:

curl example.com --silent -w '%{stderr} %{speed_download} %{time_total}' 1> somefile

相关内容