0

我需要在概念领域的帮助:

  • /usr/bin/屏幕,
  • ~/.screenrc,
  • 术语帽

我的目标:是通过“屏幕”创建一个“正确”格式的日志文件。

症状:日志文件包含数百个回车字节 [即 (\015) 或 (\r) ]。我想用换行字节[即(\012)或(\n)]替换每个回车字节。

我的方法:我创建了文件:~/.screenrc 并在其中添加了一个“termcap”行,希望在将它们写入日志文件之前拦截入站字节并将回车字节转换为换行字节。我循环浏览了我的请求的九种不同语法形式。没有一个具有预期的效果(所有九种形式见下文)。

我的问题:

  • 我的目标可以通过我的方法实现吗?
  • 如果是,我需要做出哪些改变来实现我的目标?
  • 如果不是,我应该实施什么替代方案?
  • 我需要混合“stty”命令吗?
  • 如果是,如何?

注意:我可以使用日志文件作为“tr”的输入来创建一个“正确”格式的文件:

   $  /usr/bin/tr  '\015'  '\012'  <screenlog.0  | head
   <5 BAUD ADDRESS: FF>  
   <WAITING FOR 5 BAUD INIT>  
   <5 BAUD ADDRESS: 33>  
   <5 BAUD INIT: OK>  
   Rx: C233F1 01 00                    @ 254742 ms  
   Tx: 86F110 41 00 BE 1B 30 13        @ 254753 ms  
   Tx: 86F118 41 00 88 18 00 10        @ 254792 ms  
   Tx: 86F128 41 00 80 08 00 10        @ 254831 ms  
   Rx: C133F0 3E                       @ 255897 ms  
   Tx: 81F010 7E                       @ 255903 ms  
   $  

“屏幕”日志文件 ( ~/screenlog.0 ) 是使用以下命令创建的:

$ screen -L /dev/tty.usbserial-000014FA  115200

在哪里:

$ ls -dl /dev/*usb*
crw-rw-rw-  1 root  wheel   17,  25 Jul 21 19:50 /dev/cu.usbserial-000014FA  
crw-rw-rw-  1 root  wheel   17,  24 Jul 21 19:50 /dev/tty.usbserial-000014FA  
$  
$  
$ ls -dl ~/.screenrc
-rw-r--r--  1 scottsmith  staff  684 Jul 22 12:28 /Users/scottsmith/.screenrc 

$ 猫 ~/.screenrc

 #termcap         xterm*          'XC=B%,\015\012'          #  01  no effect  
 #termcap         xterm*          'XC=B%\E(B,\015\012'      #  02  no effect  
 #termcap         xterm*          'XC=B\E(%\E(B,\015\012'   #  03  no effect  
 #terminfo        xterm*          'XC=B%,\015\012'          #  04  no effect  
 #terminfo        xterm*          'XC=B%\E(B,\015\012'      #  05  no effect  
 #terminfo        xterm*          'XC=B\E(%\E(B,\015\012'   #  06  no effect  
 #termcapinfo     xterm*          'XC=B%,\015\012'          #  07  no effect  
 #termcapinfo     xterm*          'XC=B%\E(B,\015\012'      #  08  no effect  
  termcapinfo     xterm*          'XC=B\E(%\E(B,\015\012'   #  09  no effect  
$  
$ echo $TERM  

xterm-256color  

$ echo $SCREENRC  

$ ls -dl /usr/lib/terminfo/?/*  
ls: /usr/lib/terminfo/?/*: No such file or directory  
$ ls -dl /usr/lib/terminfo/*  
ls: /usr/lib/terminfo/*: No such file or directory  
$ ls -dl /etc/termcap  
ls: /etc/termcap: No such file or directory  
$ ls -dl /usr/local/etc/screenrc  
ls: /usr/local/etc/screenrc: No such file or directory  
$  

系统:

  • MacBook Pro(17 英寸,2010 年中)
  • 处理器 2.53 GHz 英特尔酷睿 i5
  • 内存 8 GB 1067 MHz DDR3
  • 显卡 NVIDIA GeForce GT 330M 512 MB
  • OS X 优胜美地版本 10.10.4

屏幕(1)Mac OS X 手册页:(可能的相关内容):

字符翻译

Screen 具有强大的机制,可以根据当前字体和终端类型将字符转换为任意字符串。如果您想使用通用标准字符集(例如 ISO8851-latin1),即使在将更不常见的字符分散在多个国家语言字体页面上的终端上,也可以使用此功能。

Syntax: XC=<charset-mapping>{,,<charset-mapping>}  

<charset-mapping> := <designator><template>{,<mapping>}  

<mapping>         := <char-to-be-mapped><template-arg> 

大括号中的东西可以重复任意次数。A 告诉屏幕如何将字体中的字符('B':Ascii,'A':UK,'K':德语等)映射到字符串。Every 描述了单个字符将被翻译成什么字符串。使用模板机制,因为大多数时候代码有很多共同点(例如字符串来切换到另一个字符集)。每次出现的 '%' 都被替换为指定的字符和字符。如果您的字符串根本不相似,则使用 '%' 作为模板并将完整字符串放入 . 添加了一个引用机制,可以使用真正的“%”。'\' 字符引用特殊字符 '\'、'%' 和 ','。这是一个示例: termcap hp700 'XC=B\E(K%\E(B,\304[,\326\\,\334]' 这告诉屏幕如何在具有德语字符集的 hp700 终端上翻译 ISOlatin1 (charset 'B') 大写变音字符。'\304' 被翻译成 '\E(K[\E(B' 等等。注意这一行被解析建立内部查找表之前的时间,因此需要大量引用来创建单个“\”。添加了另一个扩展以允许更多模拟:如果映射转换未引用的 '%' 字符,则只要屏幕切换到相应的 . 在这种特殊情况下,假定模板只是 '%',因为字符集切换序列和字符映射通常没有太多共同之处。此示例显示了扩展名的一种用法: termcap xterm 'XC=K%,%\E(B,[\304,\\\326,]\334' 在这里,德语 ('K') 字符集的一部分是在 xterm 上模拟。如果屏幕必须更改为 'K' 字符集,'\E(B' 将被发送到终端,即使用 ASCII 字符集。模板只是 '%',所以映射是直截了当:

4

1 回答 1

0

字符翻译部分描述了一个与日志无关的特性。它讲述screen了如何使用 ISO-2022 控制序列在终端上打印特殊字符。在手册页的示例中

termcap xterm 'XC=K%,%\E(B,[\304,\\\\\326,]\334'

这告诉screen发送escape(B(假装它正在将终端切换到字符集“K”)当它必须打印任何[,\]. 副手(指XTerm Control Sequences)示例中的推理似乎晦涩难懂:

  • xterm 处理字符集“K”(德语)
  • 字符集“B”是 US-ASCII
  • 假设字符集“B”实际上呈现为 ISO-8859-1,这三个字符是 Ä、Ö 和 Ü(这是德语的合理用法,用于打印一些常见的变音符号)。

不是由此功能处理,而是screen希望在翻译之前记录发送到终端的原始字符。

于 2015-07-23T08:34:58.887 回答