保存并恢复终端内容

时间:2015-11-26 02:50:22

标签: linux terminal ansi-escape

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

说实话,我甚至不知道从哪里开始搜索。它来自curses库的命令吗?它是ANSI转义序列吗?我应该混淆tty吗?我被困住了,任何指针都会非常有用。

编辑:我想澄清一下,我并没有真正要求"如何使用替代屏幕"。我正在寻找一种方法来保存终端命令历史。我的问题的一个可能答案可能是" 使用替代屏幕"。问题"什么是替代屏幕和如何使用"是一个不同的问题,而这个问题又已经在其他地方发布了答案。谢谢:))

1 个答案:

答案 0 :(得分:8)

您应该使用 备用屏幕 终端功能。看到 Using the "alternate screen" in a bash script

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

这个例子应该说明:

#!/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:{/ p>

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
#...