我正在编写自动化脚本(perl/ bash)。他们中的许多人都受益于一些基本的终端GUI。我想我会使用标准ANSI序列进行基本绘图。在绘制终端之前,我会这样做,clear但是这样做会丢失一些终端命令历史记录。我希望能够在程序存在时还原终端命令历史记录。许多终端程序(例如less,man,vim,htop,nmon,whiptail,dialog等)这样做。所有这些都还原了终端窗口,从而使用户返回到先前执行过的所有命令历史的调用程序之前的位置。
perl
bash
ANSI
clear
less
man
vim
htop
nmon
whiptail
dialog
老实说,我什至不知道从哪里开始搜索。是curses库命令吗?它是ANSI转义序列吗?我应该弄混tty吗?我陷入困境,任何指针都将真正有帮助。
curses
tty
编辑:我想澄清一下,我并不是真的在问“如何使用替代屏幕”。我正在寻找一种保留终端命令历史记录的方法。我的问题的一个可能答案是“ 使用 替代屏幕”。问题“什么是替代屏幕以及 如何使用它 ”是一个 不同的 问题,该问题又在其他地方发布了答案。谢谢 :)
您应该使用 备用屏幕 终端功能。请参见在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
这只能在具有smcup和rmcup功能的终端上使用(例如,不能在Linux控制台(=虚拟控制台)上)。可以使用来检查终端功能infocmp。
smcup
rmcup
infocmp
在不支持它的终端上,我tput smcup只需返回退出状态1而不输出转义序列。
tput smcup
注意:
如果打算重定向输出,则可能要直接将转义序列写入到,/dev/tty以免弄脏stdout它们:
/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 #...