如何在Bash脚本中实现类似htop的终端分区域输出?
实现终端上下分区域的Bash脚本方案
要实现你要的效果,核心是利用终端的光标控制和区域划分,结合子进程分离静态头部与动态输出区域。下面直接给出可用的脚本实现和关键说明:
核心脚本示例
#!/bin/bash # 定义头部静态提示内容 HEADER_TEXT="now we are executing: sudo apt update -y" # 获取终端的行数和列数 TERM_ROWS=$(tput lines) TERM_COLS=$(tput cols) # 计算底部输出区域的起始行(头部占1行+1行分隔线) BOTTOM_START=$((TERM_ROWS - 1)) # 初始化终端:清屏+隐藏光标 tput clear tput civis # 绘制头部区域的函数 draw_header() { tput cup 0 0 # 把光标移到终端左上角 tput setaf 2 # 把文字设为绿色(可选,可自行调整颜色) printf "%-${TERM_COLS}s" "$HEADER_TEXT" # 让文本填满整行 tput sgr0 # 重置终端属性到默认 # 绘制头部与底部的分隔线 tput cup 1 0 printf "%0.s-" $(seq 1 $TERM_COLS) } # 先绘制一次头部 draw_header # 执行命令并将输出定向到底部区域 sudo apt update -y 2>&1 | while IFS= read -r line; do # 清除底部区域当前行的内容 tput cup $BOTTOM_START 0 tput el # 打印新的输出行 echo "$line" # 如果输出超过底部区域行数,自动向上滚动 tput sc # 保存当前光标位置 tput cup 2 0 tput indn $BOTTOM_START # 向上滚动底部区域 tput rc # 恢复光标位置 done # 脚本结束后恢复终端设置:显示光标+清屏 tput cnorm tput clear
关键逻辑说明
tput是终端控制工具,用来获取终端尺寸、移动光标、设置颜色、控制滚动等,是实现分区域的核心依赖。- 头部区域固定在终端顶部,用分隔线和底部输出区做视觉区分,
printf "%-${TERM_COLS}s"确保提示文本填满整行,避免残留旧内容。 - 底部区域通过循环读取命令输出,每次打印新内容前先清除当前行,再输出新内容,配合滚动指令实现类似实时日志的效果。
- 隐藏光标是为了避免输出过程中光标闪烁影响视觉体验,脚本结束后记得恢复光标显示。
扩展优化方向
- 如果需要多行头部提示,只需调整
BOTTOM_START的计算值(比如头部占2行,就设为TERM_ROWS - 2),并修改draw_header函数添加多行内容即可。 - 可以用
tput setaf设置不同颜色区分头部和输出内容,比如头部用绿色、输出用白色,提升可读性。 - 对于长时间运行的命令(如
apt upgrade),该逻辑同样适用,输出会在底部区域自动滚动更新。
内容的提问来源于stack exchange,提问作者Piyayo9
相关产品推荐
相关产品推荐

