我有这个简单的脚本:
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行长。我认为这可能会删除它们,但它显然没有,而是输出printf
和curl
统计数据之间的两个!
更改回答
根据@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
统计信息的某些部分,从而使输出变得混乱。
答案 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。