欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

[Intern][2019.03.21]LF, CR, CRLF and LFCR(?)

程序员文章站 2024-01-22 16:51:58
开玩笑的啦,没有LFCR这种沙雕东西 为什么突然想起来写这个呢,是因为先前照着shell画llehs的时候,总报错,改正了以后又因为看不见而在上一篇博客上没有写明,所以过来好好写一写咯。 可以看出报错里面出了各种稀奇古怪的东东:无法识别#!bin/sh以及觉得每一行代码后面都多了\r 故事开始于上古 ......

开玩笑的啦,没有lfcr这种沙雕东西

为什么突然想起来写这个呢,是因为先前照着shell画llehs的时候,总报错,改正了以后又因为看不见而在上一篇博客上没有写明,所以过来好好写一写咯。

[Intern][2019.03.21]LF, CR, CRLF and LFCR(?)

可以看出报错里面出了各种稀奇古怪的东东:无法识别#!bin/sh以及觉得每一行代码后面都多了\r

故事开始于上古时期,那个时期的人们还在用打字机帮助自己不用笔。最早的时候打字机是纯机械不用电的,按下enter是没有办法让光标挪动到下一行的(事实上那个时候既没有enter也没有光标啦),需要人们拉一下手柄让传动装置把纸张往上面挪一下,然后戳一个释放按钮把打字头弹回纸张最左边。这两个操作被翻译作换行(linefeed, lf)和回车(carriage return, cr)。

当今世界的qwerty键盘则是由后来大型机、小型机出现以后兴起的电传打字机(teletype, tty)继承而来,此时,enter、ctrl之类的现代案件才被加上去。

这就引出了今天我们的主角:lf和cr。虽然现在的电脑已经不用喂纸就能输入输出,可是这两个很久以前就定义,并被写进了ascii编码表的功能字符还是被继承了下来,最直观的体现就是我们在word里面看到的小小的箭头符号

[Intern][2019.03.21]LF, CR, CRLF and LFCR(?)

word很形象地告诉了我们什么是换行什么是换行回车,虽然本质上没啥区别

说了这么多看似无关的历史话题,你可能会问,为什么他会影响到我们的脚本呢?原因在这里:在microsoft家族中,无论是cmd、powershell还是其他东东,他们都使用lfcr(\n\r)来当作“该使用下一行”的识别依据;然而,linux之类的unix、类unix系统则使用lf(\n)当作本行结束,而把cr当作执行命令的标志(如果在shell里面);mac osx则使用cr当作本行结束。在文本文档里倒无所谓(最多就是排版混乱),可是在代码里,这小小的换行符就变成编译器不认识的怪东西了。上面图片中的^m 和\r都是 cr 先生的杰作。

这个故事告诉我们一个道理,如果你是跨平台开发者,一定要用一个能简便更换换行符的开发工具!而且一些奇奇怪怪的问题,很有可能是因为换行符这样的小细节导致的!

[Intern][2019.03.21]LF, CR, CRLF and LFCR(?)

vs code 里面虽然很不起眼,但是很重要的小功能