如何在Whiptail gauge进度条运行过程中处理报错问题
问题根因
你把整个for循环的标准输出通过管道传递给了gauge模式的whiptail,此时循环内所有输出到stdout的内容都会被当作进度条的控制指令。如果直接在循环内调用msgbox模式的whiptail,它的终端渲染输出会混入进度条的控制流,同时它需要读取用户按键的标准输入也会被管道占用,自然会出现异常。
解决方法
错误弹窗的whiptail单独绑定当前物理终端的输入输出,不经过连接进度条的管道即可。只需要给弹窗的whiptail加上输入输出重定向到/dev/tty(这个设备代表当前脚本运行的实际终端),就不会干扰进度条的正常运行。
完整可运行代码
#!/bin/bash array=("1" "2" "A" "3") total=${#array[@]} i=0 for element in "${array[@]}"; do # 执行命令,错误输出暂存到临时文件 command "$element" 2>/tmp/whiptail_err || { err_content=$(cat /tmp/whiptail_err) # 弹窗的输入输出全绑定到实际终端,不经过连接进度条的管道 whiptail --title "Exception" --msgbox "处理元素 $element 出错:\n$err_content" 10 80 < /dev/tty > /dev/tty 2>&1 } # 进度条更新逻辑正常输出,走管道传递给gauge echo "XXX" echo $(( 100 * i / total )) echo "当前处理:${array[$i]}" echo "XXX" i=$((i+1)) sleep 1 done | whiptail --title "Gauge" --gauge "Wait" 10 80 0 # 清理临时文件 rm -f /tmp/whiptail_err
效果说明
该实现完全匹配你的预期:
- 前两个数字执行完成后进度各上涨25%
- 遍历到字母时命令执行失败,自动弹出
--msgbox展示错误内容,等待用户按下回车确认 - 确认后自动恢复进度条运行,最后一个数字的执行逻辑和进度更新完全不受之前错误的影响
内容的提问来源于stack exchange,提问作者Bnr
相关产品推荐
相关产品推荐

