shell 输出行分隔符如何无法重置?

shell 输出行分隔符如何无法重置?

我通过 ssh 执行了一个错误的命令:

watch /bin/df | grep _23

现在我执行如下命令env并得到如下结果:

LC_TERMINAL_VERSION=3.3.4
                         LC_TERMINAL=iTerm2
                                           LC_CTYPE=en_US.UTF-8
                                                               LC_COLLATE=en_US.UTF-8
                                                                                     LC_MESSAGES=en_US.UTF-8
                                                                                                            LC_MONETARY=en_US.UTF-8
                                                                                                                                   LC_NUMERIC=en_US.UTF-8
                                                                                                                                                         LC_TIME=en_US.UTF-8
                                                                                                                                                                            LC_ALL=en_US.UTF-8
                                                                SHELL=/usr/bin/zsh                                                                                                                                                                        SSH_TTY=/dev/pts/26
   TERM=xterm-256color
                      DISPLAY=localhost:16.0
                                            XDG_SESSION_ID=18040
                                                                XDG_RUNTIME_DIR=/run/user/1000
                                                                                              SHLVL=1

看起来输出行分隔符是换行符而不是回车符。

但我不确定这是否只发生在 ssh 上。我想我在使用后vim也见过这种行为。

为什么会发生这种情况?重置它的最小方法是什么?我通常会运行,source ~/.zshrc但那太过分了。

答案1

这是众所周知Unix、Linux 和其他类 Unix 系统使用单个字符来表示文本行的结束 (EOL)。此字符称为换行符,通常表示为 \n。这有点令人困惑,因为大多数软件终端(例如 xterm)和硬件电传打字机都需要两个控制字符来前进到新行:回车符 (CR) 将光标(或打印头)移动到左边距,换行符 (LF) 将光标向下移动一行而不水平移动(或向上滚动窗口或卷起纸张)。(换行符和 LF 在数值上是相同的字节值,这一事实增加了混淆。)

类 Unix 系统通过\n在 TTY 驱动程序中将输出转换为 CR + LF 来处理此问题。但是,您可能并不总是希望发生这种情况。特别是,如果您通过 ssh 连接到非 Unix 系统,您不希望发生这种情况。并且 vim不希望发生这种情况;它喜欢能够使用换行符作为光标向下。因此该行为是可选的,并且像 ssh 这样的程序vim会禁用它。(它们应该在退出时重新启用它,但有时事情无法正常工作,例如,如果程序被中断。)

与大多数 TTY 驱动程序选项一样,它由 控制stty。该选项称为onlcr,代表

      输出时,你会看到哇喔大号ine,还输出一个 碳排放
如果你这样做stty -a(看看All stty 设置),您会看到onlcr (它可能位于倒数第二行的开头附近)。如果您stty -a在处于奇怪状态时这样做,您会看到-onlcr,表示该选项已关闭。

解决此特定问题的简单方法是键入stty onlcr以重新启用该选项。但这是一个晦涩难懂的首字母缩略词,可能很难记住。此外,如果程序(例如 ssh 或 vim)弄乱了 stty 设置,则可能还会弄乱其他不太明显的设置。有一个易于记忆的命令可以将所有 stty 设置恢复为正常值;它是

stty sane

作为jhufford 指出,有些系统有一个reset命令也可以执行此操作。

相关内容