我正在编写自动化脚本(perl / bash).其中许多受益于一些基本的终端GUI.我想我会使用标准ANSI序列进行基本绘图.在绘制终端之前我做了清楚但是这样做我丢失了一些终端命令历史记录.我希望能够在程序存在时恢复终端命令历史记录.许多终端程序(例如less,man,vim,htop,nmon,whiptail,dialog等)就是这样做的.所有这些都恢复了终端窗口,使用户返回到他之前调用程序的位置,其中包含先前执行的所有命令历史记录.
说实话,我甚至不知道从哪里开始搜索.它是来自curses库的命令吗?它是ANSI转义序列吗?我应该捣乱吗?我被卡住了,任何指针都会非常有用.
编辑:我想澄清一点,我并不是在问“如何使用替代屏幕”.我正在寻找一种方法来保存终端命令历史.我的问题的一个可能的答案可能是“使用替代屏幕”. “什么是替代屏幕以及如何使用它”的问题是一个不同的问题,而这个问题又已经在其他地方发布了答案.谢谢 :)
解决方法
您应该使用备用屏幕终端功能.看到
Using the “alternate screen” in a bash script
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
这只能在终端上工作,具有smcup和rmcup功能(例如,不在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 #...