我正在编写自动化脚本(perl
/ bash
)。其中许多受益于一些基本的终端GUI。我想我会使用标准ANSI
序列进行基本绘图。在绘制终端之前我做clear
但是这样做会丢失一些终端命令历史记录。我希望能够在我的程序存在时恢复终端命令历史记录。许多终端程序(例如less
,man
,vim
,htop
,nmon
,whiptail
,dialog
等等那。所有这些都恢复终端窗口,将用户带回到调用程序之前的位置,并使用之前执行的所有命令历史记录。
说实话,我甚至不知道从哪里开始搜索。它来自curses
库的命令吗?它是ANSI
转义序列吗?我应该混淆tty
吗?我被困住了,任何指针都会非常有用。
编辑:我想澄清一下,我并没有真正要求"如何使用替代屏幕"。我正在寻找一种方法来保存终端命令历史。我的问题的一个可能答案可能是" 使用替代屏幕"。问题"什么是替代屏幕和如何使用"是一个不同的问题,而这个问题又已经在其他地方发布了答案。谢谢:))
答案 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
这只适用于终端,具有smcup
和rmcup
功能(例如,不在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
#...