Bash脚本如何实现类似less命令的终端备用屏幕运行效果
实现方案
你提到的less类程序使用的独立终端屏幕机制叫做终端备用屏幕缓冲区(Alternate Screen Buffer),是现代终端模拟器的标准功能,不需要安装额外工具就能在脚本里直接调用,实现退出后完全恢复之前终端显示内容的效果。
核心是通过tput命令发送标准终端控制序列:
tput smcup:切换到备用屏幕缓冲区,此时终端显示的内容会和之前的主屏幕隔离,主屏幕的所有内容会被终端自动保存tput rmcup:切回主屏幕缓冲区,之前保存的终端内容会完整恢复,备用屏里的所有输出会被自动清除
为了避免脚本被Ctrl+C等信号意外中断时,终端停留在备用屏无法恢复,需要用trap绑定退出信号,保证任何情况下脚本退出时都会自动切回主屏幕。
修改后的脚本代码
#!/bin/bash # 切换到备用屏幕,自动保存当前主屏幕的显示内容 tput smcup # 捕获所有退出、中断信号,保证脚本无论以何种方式退出都能切回主屏幕 trap 'tput rmcup' EXIT INT HUP TERM # 原有业务逻辑可直接保留,不需要做核心改动 clear rm -f *.o echo "removed object files" rm -rf __pycache__ echo "removed python cache files" echo "everything cleaned, press enter to continue" read -r clear deheader echo "deheader done, press enter to continue" read -r clear cppcheck echo "cpp check done, press enter to exit" read -r clear
补充说明
- 这个方案不会强制附带滚动浏览功能,备用屏就是普通的终端输出区域,原来的交互逻辑(清屏、等待回车、运行工具)可以完全保留
tput是系统基础组件,几乎所有Linux、macOS环境默认预装,不需要额外安装依赖- 信号捕获逻辑已经覆盖了正常退出、手动Ctrl+C中断、终端挂起等常见场景,不会出现终端显示错乱的问题
- 脚本最后不需要手动写切回主屏幕的命令,绑定在
trap里的恢复逻辑会在脚本退出时自动执行
内容的提问来源于stack exchange,提问作者Kyrela
相关产品推荐
相关产品推荐

