You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:10:20