Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“我该怎么做?”;“倾倒”;X终端的内容在Linux控制台中以编程方式显示为la/dev/vcs{,a}?_Linux_Terminal_Console_Screen Scraping_Gnu Screen - Fatal编程技术网

“我该怎么做?”;“倾倒”;X终端的内容在Linux控制台中以编程方式显示为la/dev/vcs{,a}?

“我该怎么做?”;“倾倒”;X终端的内容在Linux控制台中以编程方式显示为la/dev/vcs{,a}?,linux,terminal,console,screen-scraping,gnu-screen,Linux,Terminal,Console,Screen Scraping,Gnu Screen,Linux的内核级控制台/非X终端仿真器包含一个非常酷的特性(如果在中编译):每个/dev/ttyN设备分别对应于/dev/vcsaN和/dev/vcsN设备,它们分别表示该tty的内存(显示)状态,带有和不带属性(颜色、闪烁等)。这使您可以非常轻松地cat/dev/vcs7,并在启动cat的任何位置查看/dev/tty7的转储前几天,我使用这种难以置信的实用功能,通过SSH登录到一个系统,远程观看一个dd进程,我忘了把它放在屏幕(或类似)会话中-它是在一个文本控制台上运行的,所以我花了一些时间

Linux的内核级控制台/非X终端仿真器包含一个非常酷的特性(如果在中编译):每个
/dev/ttyN
设备分别对应于
/dev/vcsaN
/dev/vcsN
设备,它们分别表示该tty的内存(显示)状态,带有和不带属性(颜色、闪烁等)。这使您可以非常轻松地
cat/dev/vcs7
,并在启动
cat
的任何位置查看
/dev/tty7
的转储
前几天,我使用这种难以置信的实用功能,通过SSH登录到一个系统,远程观看一个
dd
进程,我忘了把它放在
屏幕
(或类似)会话中-它是在一个文本控制台上运行的,所以我花了一些时间来微调我想要抓取的字符范围,目前,我正在通过SSH观看
dd
的传输状态(顺便说一句,每秒一次)

为了重申和澄清,
/dev/vcs{,a}*
是从内核控制台VT100 emulator中检索当前内存表示的字符设备,表示为单个文本“行”(屏幕的每个“行”末尾没有“换行符”)
为了消除混淆,我想指出,我不能
tail-f
这个设备:它不像TTY本身那样是一个字符流。(但不管怎样,我从来都不需要这种行为。)

多年来,我一直在为一种转储X终端仿真器的字符单元内存状态的方法——或者任何需要使用ttys的任意进程——以某种类似于Linux控制台的方式——而侧耳倾听。而且。。。我相当惊讶的是,这个问题没有实际的解决方案——因为它已经存在了大约30年——X是在1984年引入的——或者说,学究式的,至少有19年了——
/dev/vcs{,a}*
是在内核1.1.94中引入的;该版本中的最新文件日期为1995年2月22日。(最早的是1993年12月1日:P)

我想说的是,我确实理解并意识到tty本身并不是一个“屏幕缓冲区”,而是一个字符流,而我在上面基本上利用的非标准特性是Linux VT102模拟器特有的一种奇特功能。然而,这个特性很酷(为什么它会出现在主线树中?:D),在我看来,对于使用
/dev/pts*
的东西,应该与之对应

今天下午,我需要对一个交互式ncurses应用程序的输出进行屏幕截取,以便从终端中显示的信息中提取元数据。(没有其他切实可行的方法来实现我的目标。)Linux的内核VT100驱动程序将允许非常轻松地完成这样一项任务,我错误地认为,鉴于此,在X11下完成同样的任务并不那么困难

到了早上9点,我决定实验性地请求远程屏幕转储的最简单方法是运行它(想想“
screen-x
”,不带任何其他选项),然后破解
dtach
代码请求屏幕更新并退出

大约上午11点到下午12点,我请求屏幕更新并将其转储到标准输出

下午3:30左右,我承认使用
dtach
是不可能的:

  • 首先,它依靠应用程序本身发送屏幕重画请求,通过设计,保持代码简单。这很好,但是,幸运的是,我使用的应用程序不支持全屏幕重新绘制-它只会在屏幕大小改变时重新绘制(并且只有在屏幕大小确实不同的情况下!)
  • screen
    会话中运行程序(因为
    screen
    是真正的终端仿真器,并且具有内部2D字符单元缓冲区),然后在
    dtach
    中运行
    screen-x
    ,也无法生成字符单元更新
我之前检查过
屏幕
,发现该代码非常疯狂,足以消除我可能不得不破解的任何倾向;我所能说的是,所说的精神错乱可能是
screen
没有我在这里介绍的功能的原因之一(可以说这很容易实现)


与此类似的其他问题经常通过使用typescript或
script
得到答案;我只是想澄清一下,
script
将tty本身的流保存到一个文件中,我需要通过VT100仿真器来获取有关tty当前状态的屏幕图像。换句话说,
script
对我的问题来说是一个非常疯狂的解决方案。

我不认为这是可以接受的,因为它不能解决实际的核心问题(这已经有很多年了),但我能够实现我设定的具体目标

我的具体要求是,我想对交互式磁盘使用浏览器的输出进行屏幕截取,这样我就可以在另一个终端中简单地按Enter键(或执行一些类似的、简单的序列)将当前在
ncdu
中突出显示/选择的目录添加到我想要处理的文件列表中。
我的目标是不必用无休止的复制+粘贴和/或重新键入目录名(可能会有不少不准确的引导)来分散我的注意力,因此我可以专注于我想要选择的目录

screen
有一个刷新功能,可以通过按(默认)CTRL+a、CTRL+L来访问。我扩展了我的
dtach
副本,除了可以将远程屏幕转储到stdout之外,还可以发送击键,并将
dtach
包装在发送刷新序列的脚本中(
\001\014
)到
屏幕-x
内部运行