如何将GNU Parallel进度整合至Yad多进度条同一窗口?
合并YAD多进度条窗口解决方案
当前运行代码
func() { sleep 0.3 } export -f func percent1=0 for n in {1..4} ; do seq 30 | parallel -j 5 --bar func {} 2> >(yad --width=500 --progress --auto-close) let percent1+=25 echo "1:$percent1" done | yad \ --height=300 \ --multi-progress \ --auto-close \ --bar="Bar 1 :":NORM \ --bar="Bar 2 :":NORM
当前问题
运行这段代码会弹出两个窗口:
- 一个常驻窗口带两个进度条,「Bar 1」显示for循环的进度,「Bar 2」完全不动;
- 另一个窗口会反复弹出来又关掉,显示每轮for循环里GNU Parallel的执行进度。
需求
把Parallel的进度输出转到常驻窗口的「Bar 2」里,只留一个窗口,别反复弹。
修改后的代码
func() { sleep 0.3 } export -f func # 创建临时命名管道传递Parallel进度数据 pipe=/tmp/parallel_progress.pipe mkfifo "$pipe" # 脚本退出时自动删除管道 trap "rm -f $pipe" EXIT # 主循环+进度合并输出给YAD { percent1=0 for n in {1..4} ; do # 把Parallel的进度转成YAD多进度条格式,写入管道 seq 30 | parallel -j 5 --bar func {} 2>&1 | awk -v bar=2 '{sub(/.*([0-9]+)%.*/, bar":\\1"); print}' > "$pipe" let percent1+=25 echo "1:$percent1" # 每轮结束后重置Bar 2为0,方便下一轮显示 echo "2:0" > "$pipe" done } | cat - "$pipe" | yad \ --height=300 \ --multi-progress \ --auto-close \ --bar="Bar 1 :":NORM \ --bar="Bar 2 :":NORM
关键改动说明
- 用命名管道中转Parallel的进度输出,避免每次启动新YAD窗口;
- 用
awk把Parallel输出的进度文本(比如33%)转换成YAD多进度条识别的格式2:百分比,对应第二个进度条; - 通过
cat - "$pipe"把主循环的进度信息和管道里的子进度信息合并,一起传给同一个YAD进程; - 加
trap命令保证脚本退出时自动清理临时管道,避免垃圾文件残留; - 每轮Parallel任务结束后手动重置Bar 2为0,确保下一轮进度能从0开始正常增长。
内容的提问来源于stack exchange,提问作者ChameleonScales
相关产品推荐
相关产品推荐

