shell进度条显示之循序渐进
直接COPY运行
1. 显示个小棍
代码:
#/bin/bash
i=0
while [ $i -lt 10 ]
do
for j in '-' '\\' '|' '/'
do
echo -ne "\033[1D$j"
usleep 50000
done
((i++))
done
2. 显示类似wget 的进度
代码:
#!/bin/bash
i=0
while [ $i -lt 20 ]
do
((i++))
echo -ne "=>\033[s"
echo -ne "\033[40;50H"$((i*5*100/100))%"\033[u\033[1D"
usleep 50000
done
echo
3. 为什么可以在cp -a 时显示进度条及为什么应该避免这种设计
进度条显示依赖于两个关键,一是总工作量,一是当前进度量。 对于
wget 来说, 如果要获取的资源在头部有Content-Length, 那么它可以认为获得了“总工作量”, 而具体下载过程中下载了多个字节它是知道的,这种情况下得到进度百分比是轻负担的,可承受的。
对于wget获取一个使用http协议的URL来说, 如果Content-Length没有指定, 则wget 也无法获取总工作量, 它所能做的只是下载一点是一点,直到收到一个结束标志。而这种情况下即使wget也无法正确显示进度条。
注: Content-Length 头在Http协议中是可选的.
对于cp -a 这样的任务来说, 可能很多用把它用作备份的手段, 执行这个命令一般都是大宗买卖, 源往往是一个目录。 而获取这样一个目录的总大小是可能但不可负担的,你可以du -csh /usr/src/linux 试试看。 在这段时间内你差不多可以复制完成了。
另一种情况, 即使要复制的源是单个的大文件,此时总工作量易于得到, 但整个copy 过程中每时每刻的工作进度则要通过不断地轮询目标文件的大小来实现。 这需要至少两个进程/线程来实现, 比较wget在内部获得这一指标来说, cost太大了。
实际情况中这些因素的划分没有这么泾渭分明, 但作为一个简单的原因, 应该避免去选择编程代价大,维护难,消耗资源多的方案, 即使它在技术上是可行的
附:
代码:
"\033[;H" 其中代表此处应该是一个数字,表示坐标行, C为纵坐标, 定位光标
"\033[A" 以当前光标为参照,上移N行, 水平方向不动
"\033[B" 同上,下移
"\033[C" 同上,右移
"\033[D" 同上,左移
"\033[2J" 清屏
注意上面中的<>不要输入
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。