前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux命令行的一个小实验(回车和换行)

Linux命令行的一个小实验(回车和换行)

原创
作者头像
yaxin
发布2019-05-10 09:23:37
6.9K0
发布2019-05-10 09:23:37
举报
文章被收录于专栏:DevOps BoyDevOps Boy

在使用ssh远程的时候,有时候会出现如下的情况:

ls的输出完全混乱了,正常输出应该是:

解决的方法很简单,设置一下stty的模式为非raw模式(其中的opost模式起决定性作用)即可,即执行stty -raw

但是回过头我们仔细观察错乱的输出,会发现一个规律,就是新的一行的开始是上一行的结束。这是个很有趣的规律,因为通常Enter换行后都会从行首开始输出,而这个却只是简单的下移了一行,但如果你跟回车(CR)换行(LF)的概念关联起来就说的通了。

早期的打字机在打完一行后需要进行两个操作,首先手动将

打字头移动到行首,然后转动按钮让纸向上滚动一行(很多影视剧中都有展示),而这两个动作分别对应:

  • 回车,英文为Carriage Return,缩写为CR
  • 换行,英文为Line Feed,缩写为LF
打字机
打字机

而我们所遇到的情况类似与只换行而并未回车。试想一下,如果你写了一行字,然后手垂直下移继续写,那写出的效果应该与下图类似:

换行效果
换行效果

这是一个很有趣的行为,那么既然现在命令行有这样的能力,为什么我们不用它做点实验呢?我们可以通过向该终端进程的stdin写入\r\n来实现。

首先我们获取当前shell的pid(echo $$),然后通过stty raw命令将其设置为我们需要的模式,顺便按几下回车验证一下。

创建一个新的ssh链接,这一步是为了创建一个新的终端,方便对原终端的标准数据进行操作。而后进入/proc/<pid>/fd,其中将<pid>替换为之前获取到的进程ID(示例中为9044),ls查看一下目录中的文件,其中012分别代表标准输入输出、和错误,我们只需要标准输入(0)即可,而我们使用到的工具只有echoshell重定向

首先测试\n换行:

毫无悬念,跟我们预想的相同。再在来测试一下\r回车:

可以看到,字母直接打印再当前行的开头,因为回车只是将打印头移动到当前行的首位,如果此时我们再来一个回车和一些字母的话,看看会发生审核:

嗯,之前的字母被新的字母覆盖了,其实这也是符合现实的,只不过在终端下字母被替换掉了,而不是覆盖重叠了,想要恢复正常,还是要\r\n

最后,这样做并没有太大的意义,只是让我们更直观的了解到回车换行的区别。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档