cURL下载完成后,cURL压缩进度统计

时间:2017-10-22 19:34:42

标签: 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模拟回车并在下载完成后打印Download Status: Successful,从而删除Download Status: 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"

我使用那么多\r的原因是因为我在开头留下了一些空格(\n)而curl统计数据本身就是3行长。我认为这可能会删除它们,但它显然没有,而是输出printfcurl统计数据之间的两个!

  • 谁能告诉我为什么?

更改回答

根据@jmd_dk的天才使用变量,这适用于我的情况:

# Set ANSI codes as variables
esc="\x1b"
esc_up="${esc}[1A"
esc_erase="${esc}[K"
newline="\n"

# Display status before download
printf "* Download Status: Pending...${newline}${newline}"

# Initiante cURL & wait for HTML content from the homepage
homepage=$(curl "https://example.com/")
wait

# Delete all lines up to download status
printf "${esc_up}${esc_erase}"
printf "${esc_up}${esc_erase}"
printf "${esc_up}${esc_erase}"
printf "${esc_up}${esc_erase}"
printf "${esc_up}${esc_erase}"

# Display status after completion
echo "* Download Status: Successful"

我删除所有其他行会显示curl统计信息的某些部分,从而使输出变得混乱。

2 个答案:

答案 0 :(得分:3)

回车

\r不会删除它,它会将光标移动到当前行的开头 示例: echo Test; printf '\r_'将打印_est

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

printf '\r                                                      '

注意将(希望)覆盖当前行中所有内容的空格。

光标移动

\r始终保持在同一行。多个后续\r将具有与仅一个相同的效果。要删除其他行,您必须使用其他escape sequences,例如

  • \033[<N>A将光标向上移动 <N>行。
  • \033[K擦除到行尾(就像\r有很多空格一样)。

将所有东西放在一起

curl以三行显示其进展。除此之外,还有Download Status: Pending..."消息。要删除所有

  • \r\033[4A向左转,向上行四行
  • \033[K\n删除第1行并转到第2行
  • \033[K\n删除第二行并转到第三行
  • \033[K\n删除第3行并转到第4行
  • \033[K删除第4行
  • \r\033[4A向左转,再向上四行
  • Download Status: Successful打印新讯息

这给我们留下了命令

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'

答案 1 :(得分:2)

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

esc="\x1b"
esc_up="${esc}[1A"
esc_erase="${esc}[K"
echo Line 1
echo Line 2
echo Line 3
sleep 3
printf "${esc_up}${esc_up}"  # Move cursor two up
printf "${esc_erase}"  # Delete current line
echo New

这将打印三行,然后向上移动两行并覆盖文本。要了解esc_erase,请尝试将此行删除。

ANSI转义序列的世界是巨大的令人生畏的。上面的例子足以满足您的直接需求。更多信息当然是available