当前位置: 首页 > 面试题库 >

保存和还原终端内容

米嘉禧
2023-03-14
问题内容

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

老实说,我什至不知道从哪里开始搜索。是curses库命令吗?它是ANSI转义序列吗?我应该弄混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

这只能在具有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
#...


 类似资料:
  • 我正在为一个操作系统分配编写内联汇编代码。我有一些关于内联汇编和gcc编译器将其转换为机器代码的问题。 null

  • 为了降低RSS,我正在Java8上运行不同jvm选项的实验: > 用于Rss跟踪的脚本: 用于设置java进程的JVM args: 与JCMD进行差异:

  • 我正在使用带有多个搜索框的数据表,并且启用了stateSave。表确实会保存状态,但重新加载表时,搜索框不会保存。 例如,我有3个专栏...图书作者、书名和图书ISBN。我有一个搜索框为每一列更大的搜索能力。如果我在author中搜索“Mark”,所有在author中带有名称Mark的结果都会出现,这与预期的一样。刷新页面,或执行任何其他将强制重新加载表的操作(如添加一本书),将显示保存的搜索结果

  • 保存内容 能将已登录之频道的内容(项目),保存至Memory Stick™或主机内存。若要保存,可选择下述方法进行。 (1) 只选择1个项目保存 挑选想保存的项目后,选择选项选单的[保存]。 (2) 整合保存频道内的数个项目 挑选已保存的频道后,选择选项选单的[保存]。 (3) 选择数个频道后保存项目 挑选频道后,选择选项选单的[保存]。 提示 希望选择(2)或(3)时,能保存之项目数量可能因(设

  • 我正在尝试将数据写入firestore。 我试着解决其他问题。但无法解决问题。这是终端输出和createData函数。 I/flatter(18061):*I/flatter(18061):**I/flatter(18061):***E/MethodChannel#插件。颤振io/cloud_firestore(18061):无法处理方法调用E/MethodChannel插件。颤振io/cloud

  • 使用jsPlumb组件做了一个拖拽连线的功能,分别链接左右两个div的右侧和左侧,然后保存连线,下次进入编辑是,还原当前连线状态,两个div连接点位置都不对,如下: 拖动连线的状态: 数据库读取后还原的状态: 如何还原到保存前的连线状态?