mkfifo 控制并发,如何优雅显示进度条?

2022-12-23 11:30:13 +08:00
 levenwindy

代码 1 ,并发

#!/usr/bin/env sh
# 管道
tmp_fifofile=/tmp/1001.fifo              
mkfifo $tmp_fifofile
exec 1001<> $tmp_fifofile
rm $tmp_fifofile

# 线程数
thread=4
for i in `seq $thread`
do
    echo >&1001             
done

for i in {1..254}
do
    read -u 1001
    {
		sleep 0.5
		echo >&1001           
    }&          #  并发执行
done
wait
exec 1001>&-                # 释放文件描述符
echo "all finish..."

代码 2 进度条

#!/usr/bin/env sh
i=0
b=""
array=('-' '\\' '|' '/')
while [ $i -le 100 ]
do
	let idx=i%4
	printf "\e[34m\033[40m[%-100s]\e[32m\033[40m [%d%%] \e[30m \033[42m [%c] \e[0m\r" "$b" "$i" "${array[$idx]}"
	b+='#'
	sleep 0.02
	let i++
done
echo ''

想把两段代码结合在一起

# 简写
b=""
do
    {   
	# 想在代码 1 这,显示进度条
	b+="#"  
	echo "$b"
        # b 的结果 永远等于#,不能叠加
    }&
done

export b 环境变量也不行,想不到别的方法了 如果是 python ,global 声明一下就好了

想把两段代码结合在一起,或者有没相关控制并发显示进度条的例子?

1488 次点击
所在节点    Linux
1 条回复
levenwindy
2022-12-23 11:59:17 +08:00
附:
do
read -u 1001
如果将代码放在这就没问题,但是带来的问题就是,并发代码都没执行完,进度条就已经跑了
{
}&
done

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/904266

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX