【发布时间】:2015-12-19 21:34:56
【问题描述】:
在命令行上获取进度条的一种流行方法是使用回车符,它会覆盖前一行,如以下脚本所示:
#!/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
似乎要实现这一点,任何其他时候你想打印一条消息,你需要:
- 检查是否是进度条,
- 如果是,请清除该行,打印输出加上换行符,然后重新打印进度条
(或者,您可以使用 ncurses)。不幸的是,这需要所有可能的东西来提供输出来打球。
是否有任何模块化方法可以使这种进度条工作,不需要检测所有其他输出到终端的方法?
【问题讨论】: