我通过 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
,但那是矫枉过正。
众所周知,Unix、Linux和其他类 Unix 系统使用单个字符来表示文本行的结尾 (EOL)。此字符称为换行符,通常表示为
\n
。这有点令人困惑,因为大多数软件终端(例如xterm
)和硬件电传打字机需要两个控制字符才能前进到新行:回车符 (CR) 将光标(或打印头)移动到左边距,而行进纸 (LF) 将光标向下移动一行而不水平移动(或向上滚动窗口,或向上卷纸)。(Newline 和 LF 在数字上是相同的字节值的事实增加了混乱。)类 Unix 系统通过
\n
在 TTY 驱动程序的输出上转换为 CR + LF 来处理这个问题。但是,您可能并不总是希望这种情况发生。特别是,如果您通过 ssh 连接到非 Unix 系统,您不希望它发生。并且vim
不希望它发生;它喜欢能够使用换行符作为光标向下。所以这种行为是可选的,像 ssh 这样的程序并vim
禁用它。(他们应该在退出时重新启用它,但有时事情不能正常工作,例如,如果程序被中断。)与大多数 TTY 驱动程序选项一样,它由
stty
. 该选项被称为onlcr
,它代表
如果你这样做(在输出上,当你看到一个新行时,也输出 一个CR
stty -a
查看所有 stty 设置),你会看到 (它可能在倒数第二行的开头附近)。如果您在处于怪异状态时这样做,您会看到,表示该选项已关闭。onlcr
stty -a
-onlcr
解决此特定问题的简单方法是键入
stty onlcr
以重新打开该选项。但这是一个晦涩难懂的缩写,可能很难记住。此外,如果程序(例如 ssh 或vim
)与 stty 设置混淆,它可能与其他不那么明显的设置混淆。有一个易于记忆的命令将所有 stty 设置恢复为正常值;这是正如jhufford 指出的那样,一些系统有一个
reset
命令也可以做到这一点。