一尘不染

保存和还原终端内容

linux

我正在编写自动化脚本(perl/
bash)。他们中的许多人都受益于一些基本的终端GUI。我想我会使用标准ANSI序列进行基本绘图。在绘制终端之前,我会这样做,clear但是这样做会丢失一些终端命令历史记录。我希望能够在程序存在时还原终端命令历史记录。许多终端程序(例如lessmanvimhtopnmonwhiptaildialog等)这样做。所有这些都还原了终端窗口,从而使用户返回到先前执行过的所有命令历史的调用程序之前的位置。

老实说,我什至不知道从哪里开始搜索。是curses库命令吗?它是ANSI转义序列吗?我应该弄混tty吗?我陷入困境,任何指针都将真正有帮助。

编辑:我想澄清一下,我并不是真的在问“如何使用替代屏幕”。我正在寻找一种保留终端命令历史记录的方法。我的问题的一个可能答案是“ 使用
替代屏幕”。问题“什么是替代屏幕以及 如何使用它 ”是一个 不同的 问题,该问题又在其他地方发布了答案。谢谢 :)


阅读 424

收藏
2020-06-03

共1个答案

一尘不染

您应该使用 备用屏幕 终端功能。请参见在bash脚本中使用“备用屏幕”]

回答 “如何使用备用屏幕”

此示例应说明:

#!/bin/sh
: <<desc
Shows the top of /etc/passwd on the terminal for 1 second 
and then restores the terminal to exactly how it was
desc

tput smcup #save previous state

head -n$(tput lines) /etc/passwd #get a screenful of lines
sleep 1

tput rmcup #restore previous state

这只能在具有smcuprmcup功能的终端上使用(例如,不能在Linux控制台(=虚拟控制台)上)。可以使用来检查终端功能infocmp

在不支持它的终端上,我tput smcup只需返回退出状态1而不输出转义序列。


注意:

如果打算重定向输出,则可能要直接将转义序列写入到,/dev/tty以免弄脏stdout它们:

exec 3>&1 #save old stdout
exec 1>/dev/tty #write directly to terminal by default
#...
cat /etc/passwd >&3 #write actual intended output to the original stdout
#...
2020-06-03