我通过 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
命令也可以执行此操作。