【问题标题】:Save and restore terminal content保存和恢复终端内容
【发布时间】:2016-02-29 00:41:09
【问题描述】:

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

说实话,我什至不知道从哪里开始搜索。它是来自curses 库的命令吗?它是ANSI 转义序列吗?我应该惹tty吗?我被卡住了,任何指针都会很有帮助。

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

【问题讨论】:

  • 这应该可以解决您的问题:unix.stackexchange.com/questions/85398/… 这是一个 xterm 功能。并非每个终端都支持它。 Linux 控制台(你在虚拟控制台中得到的)没有。
  • @PSkocik 这看起来像我想要的。毕竟是转义序列。谢谢!您可以将其发布为答案,我会接受。
  • 他们是不同的问题。这个问题可能有多个不同的答案,其中之一是“使用替代屏幕”。另一个问题是“如何使用替代屏幕”。

标签: linux terminal ansi-escape


【解决方案1】:

您应该使用备用屏幕终端功能。看 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

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

【讨论】:

  • linux虚拟控制台现在好像有这个功能了:)
猜你喜欢
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
相关资源
最近更新 更多