使用 GNU Screen 时的行尾

me_*_*and 5 ssh gnu-screen

在 Red Hat Enterprise Linux 6.4 系统上使用 GNU Screen 4.00.03 时,我看到一些有点奇怪的行为。

如果我在没有 Screen 的情况下连接,查看日志我可以看到每行都以 CRLF ( 0x0D 0x0A)终止,完全符合预期。

如果我连接并运行 Screen,则具有两个或更多字符的行会按预期以 CRLF 终止。没有打印字符的行(例如,运行一个bare echo)仅以LF ( 0x0A)终止,最奇怪的是,具有单个打印字符的行(例如echo x)以BSLF ( 0x08 0x0A)终止。

我在 PuTTY 上看到了这一点,上面的日志来自 PuTTY 日志。我也在使用 Pexpect 的自动化 Python 框架中看到了这一点,所以我不会为此责怪 PuTTY。

这是怎么回事?我该如何阻止?

Sté*_*las 7

这是由screen.

当您键入echo<Cr>screen。因为本地回波和的icrnlonlcr在伪终端设备的设置screen窗口中,所述\r\n序列被发送到主侧(屏幕)。

screen实现一个终端模拟器,\r用于将光标移动到行首并向\n下移动光标。要做到这一点,像 xterm 这样的终端模拟器会执行 X API 调用以将光标移动到行首,screen必须将转义码发送到它所连接的主机终端,以告诉它/他们将光标移动到行首。屏幕窗口的左侧。

如果您垂直拆分窗口,这意味着将光标定位转义序列发送到屏幕窗口左侧的任何位置。如果没有,或者如果在主机端的左侧,screen也只是通过那些\r\n字符一起使光标移动到行的开头和一个线下的主机终端,以及(因为所有终端处理\r\n对在那种情况下相同)。

现在,echo运行并输出一个\n字符。因为onlcr又在screen窗口tty,又screen收到\r\n了。\r告诉它移动到行首,但光标已经在行首,所以不需要做任何事情,这就是主机终端没有收到第二个\r字符的原因。然后将光标向下移动,因为\n它接收到,screen发送\n到主机终端。

您可以通过在屏幕中运行来验证:

printf '\r\r\r\r'
Run Code Online (Sandbox Code Playgroud)

您会注意到screen它只向其主机终端发送一个 \r字符。

  • 这涵盖了正在发生的事情。现在我怎么能阻止它这样做?我可以在 `.screenrc` 中禁用 `icrnl` 和 `onlcr` 吗? (2认同)