【发布时间】:2022-05-07 22:37:44
【问题描述】:
我使用以下语法上传文件:
curl --form upload=@localfilename --form press=OK [URL]
如何显示进度?谢谢。
【问题讨论】:
-
curl.haxx.se/docs/manpage.html 请参阅进度表部分。我怀疑您需要将输出通过管道传输到文件中,但不是肯定的。
标签: curl
我使用以下语法上传文件:
curl --form upload=@localfilename --form press=OK [URL]
如何显示进度?谢谢。
【问题讨论】:
标签: curl
这是我在我的一个构建脚本中使用的:
curl "${UPLOAD_URL}" \
--progress-bar \
--verbose \
-F build="${BUILD}" \
-F version="${VERSION}" \
-F ipa="@${IPA};type=application/octet-stream" \
-F assets="@-;type=text/xml" \
-F replace="${REPLACE}" \
-A "${CURL_FAKE_USER_AGENT}" \
<<< "${ASSETS}" \
| tee -a "${LOG_FILE}" ; test ${PIPESTATUS[0]} -eq 0
-F 和 -A 选项您可能不会感兴趣,但有用的部分是:
curl "${UPLOAD_URL}" --progress-bar
告诉curl 在上传期间显示进度条(而不是默认的“进度表”),并且:
| tee -a "${LOG_FILE}" ; test ${PIPESTATUS[0]} -eq 0
将命令的输出附加到日志文件,并将其回显到stdout。 test ${PIPESTATUS[0]} -eq 0 部分使得该行的退出状态(在 bash 脚本中)与 curl 命令返回的退出代码相同,而不是 tee 命令的退出状态(这是必要的,因为 @ 987654332@ 实际上是这一行执行的最后一个命令,而不是curl)。
来自man curl:
PROGRESS METER
curl normally displays a progress meter during operations, indicating the
amount of transferred data, transfer speeds and estimated time left, etc.
curl displays this data to the terminal by default, so if you invoke curl
to do an operation and it is about to write data to the terminal, it disables
the progress meter as otherwise it would mess up the output mixing progress
meter and response data.
If you want a progress meter for HTTP POST or PUT requests, you need to
redirect the response output to a file, using shell redirect (>), -o [file]
or similar.
It is not the same case for FTP upload as that operation does not spit out
any response data to the terminal.
If you prefer a progress "bar" instead of the regular meter, -# is your
friend.
OPTIONS
-#, --progress-bar
Make curl display progress as a simple progress bar instead of the
standard, more informational, meter.
【讨论】:
tee 命令需要获取有关下载进度的信息。如果您不想使用tee,那么只需使用grep -v '^uniqueStringNeverHappens$' 命令。更多信息:stackoverflow.com/a/17178410/751932
> /dev/null
time curl --progress-bar --verbose ...,它可以防止显示进度条。没有时间运行它。
这里的所有其他答案都有一个问题,它们要求您将 curl 的原始输出写入(日志)文件。然而,这可能并非在所有情况下都需要。
问题是 curl 隐藏进度条/仪表,当预期服务器响应时,然后将其写入标准输出。
所以基本上你可以将输出重定向到一个文件以再次显示该栏。但是我们不希望这样,所以/dev/null 和tee 可以在这里帮助我们:
curl --progress-bar -T "${SOME_LARGE_FILE}" "${UPLOAD_URL}" | cat
Curl 的输出被传递给tee,它将输出写入控制台(我们希望看到进度条和服务器响应)和文件(我们不需要,但我们使用/dev/null 这没关系)。
请注意,curl 开发人员当然不会为了好玩而隐藏进度条。在这种情况下,您可能并不总是看到服务器结果,或者它可能只显示几秒钟(因为之后会再次显示进度条),但如果您不关心这一点,那么解决方案是一个不错的解决方案。
【讨论】:
--progress-bar 提供进度条。
curl --progress-bar ... | tee /dev/null?就我而言,curl --progress-bar ... | cat 似乎也能正常工作。
我在接受答案的命令重定向时遇到问题,发现-o 选项会将响应输出放在一个允许显示进度条的文件中。
curl --progress-bar \
-o upload.txt \
-H ${SOME_AUTH_HEADER} \
-T ${SOME_LARGE_FILE} \
"${UPLOAD_URL}"
获得所需结果的另一种选择。
注意:在手册页中强调这一行对于理解为什么在仅指定 --progress-bar 时没有显示进度条的根本原因非常重要。
If you want a progress meter for HTTP POST or PUT requests,
you need to redirect the response output to a file,
using shell redirect (>), -o [file] or similar.
【讨论】:
在 Windows 上显示进度条: curl --progress-bar --upload-file Myfile.zip "https://my.upload.site/Some/Upload/Path/Myfile.zip" |输入
【讨论】:
谁想要将进度从标准错误转移到标准输出:
curl ... -o ... ... 2>&1 | sed -E 's/\r([^\n])/\n\1/g' | grep -P '^(?: [% ] |(?: | \d|\d\d)\d |[<>] )'
tested on download
sed 必须用于通过将CR 替换为LF 来忽略空白行。
这是在详细或非详细模式下统一解析 curl 输出所必需的。
【讨论】: