如何让BASH Dialog的tailbox在脚本结束后自动延迟关闭?
解决Dialog Tailbox自动关闭问题
核心思路
通过监控initRPI后台进程的状态,在硬件初始化完成后延迟2秒,自动关闭tailbox对话框,无需用户手动操作。
修改后的代码实现
1. 更新initRPI函数(添加关闭提示)
function initRPI { # Wait for carrier Board to be plugged in, then initialize CM Unit echo -e "Plug in carrier board with compute module attached.\n" pkill "rpiboot" sleep 0.5 $FILE # Run rpiboot from where it's installed # 添加加粗的关闭提示,让用户明确知晓对话框即将自动关闭 echo -e "\n\033[1mCompute Module Initialized - Closing in 2 seconds...\033[0m" }
2. 修改writeImage函数(添加进程监控与自动关闭逻辑)
function writeImage { # Find proper image and write it to device if [[ " ${boxTypes[*]} " =~ "$boxType" ]]; then # 启动initRPI后台进程并记录其PID initRPI > _temp & init_pid=$! # 启动tailbox对话框后台运行,同时记录对话框PID,保留60秒超时兜底 dialog --backtitle "$backTitle" --fb --title "Image Writer" --timeout 60 --tailbox _temp 15 70 & dialog_pid=$! # 等待硬件初始化进程完成 wait $init_pid # 延迟2秒,给用户足够时间查看完成提示 sleep 2 # 自动关闭对话框,忽略进程已退出的错误信息 kill $dialog_pid 2>/dev/null # 后续原有逻辑保持不变 if pgrep -f rpiboot &> /dev/null 2>&1; then pkill "rpiboot" dialogMsg FAILED "Compute Module was not initialized." else devCM="/dev/sda" if [ ! -d "/mnt/firmware" ]; then mkdir /mnt/firmware fi mount -t nfs $nasIP/firmware /mnt/firmware (pv -n "/mnt/firmware/${unitSerial:2:4}.img" | dd of="$devCM" bs=4M conv=notrunc,noerror) 2>&1 | dialog --gauge "Running cloning $imageName to device $1, please wait..." 10 70 0 sleep 0.5 if kill -0 "$pid" ; then dialogMsg SUCCESS "Image $imageName written to device $1." else dialogMsg FAILED "Image $imageName failed to write to device $1." fi fi else dialogMsg ERROR "Can't find $boxType in the model list." fi }
关键修改点说明
- 记录进程PID:分别记录
initRPI和dialog的进程ID,确保能精准控制流程 - 后台运行对话框:将
dialog改为后台执行,让脚本可以同时监控初始化进程状态 - 等待初始化完成:使用
wait $init_pid阻塞脚本,直到硬件初始化流程结束 - 延迟自动关闭:
sleep 2给用户预留查看提示的时间,随后通过kill命令关闭对话框 - 错误兼容:
kill命令后添加2>/dev/null,避免因对话框已超时退出而抛出错误
内容的提问来源于stack exchange,提问作者Kevitto
相关产品推荐
相关产品推荐

