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

能否用Bash实现双分区终端窗口?含滚动视图与热键菜单

当然可以搞定!虽然纯Bash单独做终端分屏和热键处理有点捉襟见肘,但结合终端复用工具(比如tmux)或者用Bash搭配tput/read这类基础命令,完全能实现你要的效果。下面给你两个方向的最简示例,你可以基于这个扩展成自己的CLI工具:

纯Bash基础实现(快速原型)

这个版本用tput获取终端尺寸来划分区域,less做只读滚动查看器,底部用循环处理热键输入,适合快速验证想法:

#!/bin/bash

# 获取终端高度,计算分区尺寸
TERM_HEIGHT=$(tput lines)
VIEWER_HEIGHT=$(( TERM_HEIGHT * 9 / 10 ))
MENU_HEIGHT=$(( TERM_HEIGHT - VIEWER_HEIGHT ))

# 初始化终端布局
tput clear
tput cup $VIEWER_HEIGHT 0  # 把光标移到底部菜单区域

# 启动只读查看器(用less的默认滚动快捷键)
less -R -S -N <(echo "这是只读滚动文本区域,可用↑↓/PgUp/PgDn滚动,q退出查看器") &
LESS_PID=$!

# 底部菜单热键处理循环
while true; do
    # 刷新菜单提示
    tput cup $VIEWER_HEIGHT 0
    echo -n "菜单:^S保存 | ^C清空 | q退出整个程序"
    tput el  # 清除当前行多余内容

    # 读取单个按键(不回显,超时1秒避免阻塞查看器)
    read -rsn1 -t1 key

    # 处理不同热键
    case "$key" in
        $'\x13')  # 对应^S
            echo -e "\n[操作] 保存内容到/tmp/viewer_log.txt" >> /tmp/viewer_log.txt
            ;;
        $'\x03')  # 对应^C
            echo -e "\n[操作] 清空/tmp/viewer_log.txt" > /tmp/viewer_log.txt
            ;;
        'q')
            kill $LESS_PID  # 终止查看器
            tput clear
            exit 0
            ;;
    esac
done

注意:这个纯Bash版本有个小局限——当你滚动less的时候,底部菜单可能会有闪烁,因为less会占用终端焦点刷新内容。如果追求更稳定的体验,推荐用下面的tmux版本。

Tmux进阶实现(推荐用于正式开发)

Tmux的原生分屏功能天生适合这个场景,分屏稳定且互不干扰,热键处理也更可靠。下面是一个一键启动的脚本:

#!/bin/bash

# 启动新的tmux会话(后台运行)
tmux new-session -d -s split_viewer

# 垂直分割窗口:底部占10%高度作为菜单区
tmux split-window -v -p $((100 * 1 / 10))

# 顶部窗格启动只读查看器
tmux send-keys -t split_viewer:0.0 'less -R -S -N <(echo "这是只读滚动文本区域,用less默认快捷键操作")' C-m

# 底部窗格启动菜单交互脚本
tmux send-keys -t split_viewer:0.1 '
#!/bin/bash
while true; do
    echo -n "菜单:^S保存 | ^C清空 | q退出程序"
    read -rsn1 key
    case "$key" in
        $'\''\x13'\'')
            echo -e "\n✅ 保存成功!内容已写入/tmp/viewer_log.txt" >> /tmp/viewer_log.txt
            ;;
        $'\''\x03'\'')
            echo -e "\n✅ 已清空/tmp/viewer_log.txt" > /tmp/viewer_log.txt
            ;;
        '\''q'\'')
            tmux kill-session -t split_viewer
            exit 0
            ;;
    esac
    tput cuu1 && tput el  # 回到上一行并清除内容,避免菜单重复输出
done
' C-m

# 默认选中顶部查看器窗格,让用户直接操作
tmux select-pane -t split_viewer:0.0

# 附加到tmux会话,进入分屏界面
tmux attach-session -t split_viewer

开发扩展建议

  • 把示例中的<(echo "...")换成实际的日志文件、命令输出或者动态生成的内容
  • 热键部分可以结合stty修改终端属性,支持更多复杂快捷键
  • 如果是个人长期使用,可以把tmux的分屏配置整合到你的~/.tmux.conf里,简化启动流程

内容的提问来源于stack exchange,提问作者Yuri Tinyukov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:38:24