gpt4 book ai didi

bash - 带有其他输出的命令行进度条

转载 作者:行者123 更新时间:2023-12-02 09:29:45 24 4
gpt4 key购买 nike

在命令行上获取进度条的一种流行方法是使用回车符,它会覆盖上一行,如以下脚本所示:

#!/bin/bash
echo -ne '[# ] 25%\r'
sleep 1
echo -ne '[## ] 50%\r'
sleep 1
echo -ne '[### ] 75%\r'
sleep 1
echo -ne '[####] 100%\r'

这没问题...如果您想要打印进度条。但是更复杂的脚本可能想要在输出诊断输出的同时打印进度条。您希望命令行应用程序的缓冲区演化如下(用 ---- 分隔):

[#   ] 25%
----
msg1
[# ] 25%
----
msg1
msg2
[# ] 25%
----
msg1
msg2
[## ] 50%

等而现在,流行的方法失败了:

#!/bin/bash
echo -ne '[# ] 25%\r'
echo "msg 1"
sleep 1
echo "msg 2"
echo -ne '[## ] 50%\r'
echo "msg 3"
sleep 1
echo "msg 4"
echo -ne '[### ] 75%\r'
sleep 1
echo -ne '[####] 100%\r'

输出

ezyang@sabre:~$ ./test.sh 
msg 1] 25%
msg 2
msg 3] 50%
msg 4

似乎要实现这一点,任何其他时候你想打印一条消息,你需要:

  1. 检查是否是进度条,
  2. 如果是,清除该行,打印你的输出加上一个换行符,然后重新打印进度条

(或者,您可以使用 ncurses)。不幸的是,这需要所有可能的输出来打球。

是否有任何模块化方法可以使这种进度条工作,不需要检测所有其他输出到终端的方法?

最佳答案

更新:您可以使用 ANSI/VT100 转义码/序列执行此操作。

在我添加一个工作示例之前,您需要了解以下内容:

  • 您需要确保输出到 TTY/控制台。

  • 您需要了解 IO (stdout/stderr) 之间的区别线路和 TTY 线路。\r 会将您带到 IO 行的开头,即使该行跨越多个 TTY 行也是如此。

  • Windows 控制台本身不支持这些代码/序列。但是你可以在 ConEmu 中使用它们(推荐),或使用 ansicon .


这是一个工作示例。代码应该是不言自明的:

 #!/bin/bash

ERASE_SCREEN_AFTER="\033[0J"
ERASE_LINE_BEFORE="\033[1K"
ERASE_LINE_AFTER="\033[0K"
UP="\033[1A"

up_count=2
messages="\n"
progress=""

echo_repeat() {
c="$2"
while (( c )); do
echo -en "$1"
(( c-- ))
done
}

update_status() {
echo_repeat "$UP" "$up_count"
echo -en "$ERASE_LINE_BEFORE" "$ERASE_SCREEN_AFTER" "\r"
echo -en "$messages"
echo "$progress"
}

add_msg() {
messages+="$@\n"
update_status
(( up_count++ ))
}

set_progress() {
progress="$@"
update_status
}

echo_repeat "\n" $up_count

set_progress '[# ] 25%'
add_msg "msg 1"
sleep 1

add_msg "msg 2"
set_progress '[## ] 50%'
add_msg "msg 3"
sleep 1

add_msg "msg 4"
set_progress '[### ] 75%'
sleep 1

set_progress '[####] 100%'

您可以单独使用这些代码/序列做更多的事情,而无需使用(n) 诅咒。这包括设置前景色/背景色、使用粗体以及其他功能。

saldl是 CLI 程序的一个示例,其中广泛使用了这些代码/序列。


旧答案(已过时):如果我正确理解您的问题,您需要做的就是在 msg 之前添加一个 \n行。

关于bash - 带有其他输出的命令行进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34375643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com