Bash cURL下载完成后,cURL将超过进度统计

Bash cURL下载完成后,cURL将超过进度统计,bash,shell,unix,curl,Bash,Shell,Unix,Curl,我有一个简单的脚本: printf "* Download Status: Pending..." # Get HTML content from homepage homepage=$(curl -s "https://example.com/") wait printf "\r* Download Status: Successful\n" 下载完成后,\r模拟回车并打印下载状态:Successful,从而删除下载状态:Pending…。这是完美的 如果省略-s标志,curl将显示统计

我有一个简单的脚本:

printf "* Download Status: Pending..."

# Get HTML content from homepage
homepage=$(curl -s "https://example.com/")
wait

printf "\r* Download Status: Successful\n"
下载完成后,
\r
模拟回车并打印
下载状态:Successful
,从而删除
下载状态:Pending…
。这是完美的

如果省略
-s
标志,
curl
将显示统计信息,直到下载完成

  • 如何在下载过程中显示统计信息,并在
    curl
    完成后将其删除
我试着使用类似于:

printf "< Download Status: Pending...\n\n"

# Get HTML content from homepage
homepage=$(curl "https://example.com/")
wait

printf "\r\r\r\r\r\r> Download Status: Successful\n"
我删除了所有行,否则将显示
curl
stats的某些部分,使输出混乱。

回车
\r
不会删除该行,而是将光标移动到当前行的开头。
示例:
回波测试;printf'\r\u'
将打印
\u est

要使用
\r
删除当前行,必须使用

printf '\r                                                      '
请注意将(希望)覆盖当前行中所有内容的空格

光标移动
\r
始终保持在同一行。多个后续
\r
s将具有与一个相同的效果。要删除其他行,必须使用其他行,例如

  • \033[A
    将光标向上移动
  • \033[K
    擦除到行尾(就像带有大量空格的
    \r
把所有的东西放在一起
curl
以三行显示其进度。最上面是您的
下载状态:挂起…”
消息。要将其全部删除

  • \r\033[4A
    向左上四行
  • \033[K\n
    删除第一行并转到第二行
  • \033[K\n
    删除第2行并转到第3行
  • \033[K\n
    删除第3行并转到第4行
  • \033[K
    删除第四行
  • \r\033[4A
    向左走,再向上走四行
  • 下载状态:成功
    打印新邮件
这就留给我们指挥权

echo "* Download Status: Pending..."
homepage=$(curl "https://example.com/")
wait
printf '\r\033[4A\033[K\n\033[K\n\033[K\n\033[K' # delete 4 lines
printf '\r\033[4A'                               # reposition cursor
echo '* Download Status: Successful'
您可以将最后三行写成一行
printf
,但这将更难阅读

可供替代的 如果您不介意丢失所有输出(甚至是脚本之前执行的命令的输出),只需一个转义序列即可清除整个屏幕:
\033c

echo "* Download Status: Pending..."
homepage=$(curl "https://example.com/")
wait
printf '\033c' # clear screen
echo '* Download Status: Successful'
回车
\r
不会删除该行,而是将光标移动到当前行的开头。
示例:
回声测试;printf'\r\u'
将打印
\u est

要使用
\r
删除当前行,必须使用

printf '\r                                                      '
请注意将(希望)覆盖当前行中所有内容的空格

光标移动
\r
始终保持在同一行中。多个后续的
\r
将具有与一行相同的效果。要删除其他行,必须使用其他行,例如

  • \033[A
    将光标向上移动
  • \033[K
    擦除到行尾(就像带有大量空格的
    \r
把所有的东西放在一起
curl
以三行显示其进度。最上面是您的
下载状态:挂起…”
消息。要将其全部删除

  • \r\033[4A
    向左上四行
  • \033[K\n
    删除第一行并转到第二行
  • \033[K\n
    删除第2行并转到第3行
  • \033[K\n
    删除第3行并转到第4行
  • \033[K
    删除第四行
  • \r\033[4A
    向左走,再向上走四行
  • 下载状态:成功
    打印新邮件
这就留给我们指挥权

echo "* Download Status: Pending..."
homepage=$(curl "https://example.com/")
wait
printf '\r\033[4A\033[K\n\033[K\n\033[K\n\033[K' # delete 4 lines
printf '\r\033[4A'                               # reposition cursor
echo '* Download Status: Successful'
您可以将最后三行写成一行
printf
,但这将更难阅读

可供替代的 如果您不介意丢失所有输出(甚至是脚本之前执行的命令的输出),只需一个转义序列即可清除整个屏幕:
\033c

echo "* Download Status: Pending..."
homepage=$(curl "https://example.com/")
wait
printf '\033c' # clear screen
echo '* Download Status: Successful'

一种解决方案是使用更复杂(ANSI)的转义序列。例如(运行前将其保存到脚本中):

这将打印三行,然后上移两行并覆盖文本。要理解
esc\u erase
,请尝试删除这一行


ANSI转义序列的世界是巨大的,令人望而生畏。上面的示例应该足以满足您当前的需要。当然,还有更多信息。

一个解决方案是使用更复杂的(ANSI)转义序列。示例(运行前将其保存到脚本中):

这将打印三行,然后上移两行并覆盖文本。要理解
esc\u erase
,请尝试删除这一行


ANSI转义序列的世界是浩瀚的,令人望而生畏。上面的例子应该足以满足您的迫切需要。当然还有更多的信息。

就像一个咒语@jmd_dk!我根据您的回答更新了我的问题。为ANSI代码使用变量的想法使脚本更加清晰。就像一个咒语@jmd_dk!我更新了d根据您的回答,我的问题。ANSI代码使用变量的想法使脚本更加清晰。感谢@Socowi的详细解释。我喜欢使用变量的想法,因为它们有助于维护概述。干杯!感谢@Socowi的详细解释。我喜欢使用变量的想法,因为它们有助于维护ove看,干杯!