我需要在概念领域提供帮助:
我的目标:是通过“屏幕”创建“正确”格式化的日志文件。
症状:日志文件包含数百个回车字节[即(\ 015)或(\ r \ n)]。我想用换行字节替换每个回车字节[即(\ 012)或(\ n)]。
我的方法:我创建了文件:〜/ .screenrc并添加了一个'termcap'行,希望拦截入站字节并将回车字节转换为换行字节在将它们写入日志文件之前。我循环了九种不同的语法形式。没有任何效果(见下面所有九种形式)。
我的问题:
注意:我可以使用日志文件创建'正确'格式的文件作为'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
$ cat~ / .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
$
系统:
屏幕(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':德语等)中的字符映射到字符串。每个描述单个字符将被翻译的字符串。使用模板机制,因为大多数情况下代码有很多共同之处(例如,要切换到另一个字符集的字符串)。每次出现的'%'都会被指定的字符替换。如果你的字符串完全不相似,那么使用'%'作为模板并将完整的字符串放入。添加了一个引用机制,可以使用真正的'%'。 '\'字符引用特殊字符'\','%'和','。 这是一个例子: 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字符集。模板只是'%',因此映射很简单:'[' ''304','\'到'\ 326','''到'\ 334'。
答案 0 :(得分:0)
character translation部分描述了与日志记录无关的功能。它告诉screen
如何使用ISO-2022控制序列在终端上打印特殊字符。在手册页的示例中
termcap xterm 'XC=K%,%\E(B,[\304,\\\\\326,]\334'
这告诉screen
发送 escape ( B (假装它正在将终端切换到字符集“K” “)当它必须打印任何 [, \ 或] 。Offhand(指XTerm Control Sequences)中的推理例子似乎模糊不清:
screen
的日志记录不是由此功能处理,而是在翻译之前记录发送到终端的原始字符。