在使用ssh远程的时候,有时候会出现如下的情况:
ls
的输出完全混乱了,正常输出应该是:
解决的方法很简单,设置一下stty的模式为非raw模式(其中的opost模式起决定性作用)即可,即执行stty -raw
。
但是回过头我们仔细观察错乱的输出,会发现一个规律,就是新的一行的开始是上一行的结束。这是个很有趣的规律,因为通常Enter
换行后都会从行首开始输出,而这个却只是简单的下移了一行,但如果你跟回车(CR)和换行(LF)的概念关联起来就说的通了。
早期的打字机在打完一行后需要进行两个操作,首先手动将
打字头移动到行首,然后转动按钮让纸向上滚动一行(很多影视剧中都有展示),而这两个动作分别对应:
CR
LF
而我们所遇到的情况类似与只换行而并未回车。试想一下,如果你写了一行字,然后手垂直下移继续写,那写出的效果应该与下图类似:
这是一个很有趣的行为,那么既然现在命令行有这样的能力,为什么我们不用它做点实验呢?我们可以通过向该终端进程的stdin
写入\r
或\n
来实现。
首先我们获取当前shell的pid(echo $$
),然后通过stty raw
命令将其设置为我们需要的模式,顺便按几下回车验证一下。
创建一个新的ssh链接,这一步是为了创建一个新的终端,方便对原终端的标准数据进行操作。而后进入/proc/<pid>/fd
,其中将<pid>
替换为之前获取到的进程ID(示例中为9044),ls
查看一下目录中的文件,其中0
、1
、2
分别代表标准输入、输出、和错误,我们只需要标准输入(0
)即可,而我们使用到的工具只有echo
和shell重定向
。
首先测试\n
换行:
毫无悬念,跟我们预想的相同。再在来测试一下\r
回车:
可以看到,字母直接打印再当前行的开头,因为回车只是将打印头移动到当前行的首位,如果此时我们再来一个回车和一些字母的话,看看会发生审核:
嗯,之前的字母被新的字母覆盖了,其实这也是符合现实的,只不过在终端下字母被替换掉了,而不是覆盖重叠了,想要恢复正常,还是要\r\n
:
最后,这样做并没有太大的意义,只是让我们更直观的了解到回车和换行的区别。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。