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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:05:21