[Intern][2019.03.21]LF, CR, CRLF and LFCR(?)
开玩笑的啦,没有lfcr这种沙雕东西
为什么突然想起来写这个呢,是因为先前照着shell画llehs的时候,总报错,改正了以后又因为看不见而在上一篇博客上没有写明,所以过来好好写一写咯。
可以看出报错里面出了各种稀奇古怪的东东:无法识别#!bin/sh以及觉得每一行代码后面都多了\r
故事开始于上古时期,那个时期的人们还在用打字机帮助自己不用笔。最早的时候打字机是纯机械不用电的,按下enter是没有办法让光标挪动到下一行的(事实上那个时候既没有enter也没有光标啦),需要人们拉一下手柄让传动装置把纸张往上面挪一下,然后戳一个释放按钮把打字头弹回纸张最左边。这两个操作被翻译作换行(linefeed, lf)和回车(carriage return, cr)。
当今世界的qwerty键盘则是由后来大型机、小型机出现以后兴起的电传打字机(teletype, tty)继承而来,此时,enter、ctrl之类的现代案件才被加上去。
这就引出了今天我们的主角:lf和cr。虽然现在的电脑已经不用喂纸就能输入输出,可是这两个很久以前就定义,并被写进了ascii编码表的功能字符还是被继承了下来,最直观的体现就是我们在word里面看到的小小的箭头符号
word很形象地告诉了我们什么是换行什么是换行回车,虽然本质上没啥区别
说了这么多看似无关的历史话题,你可能会问,为什么他会影响到我们的脚本呢?原因在这里:在microsoft家族中,无论是cmd、powershell还是其他东东,他们都使用lfcr(\n\r)来当作“该使用下一行”的识别依据;然而,linux之类的unix、类unix系统则使用lf(\n)当作本行结束,而把cr当作执行命令的标志(如果在shell里面);mac osx则使用cr当作本行结束。在文本文档里倒无所谓(最多就是排版混乱),可是在代码里,这小小的换行符就变成编译器不认识的怪东西了。上面图片中的^m 和\r都是 cr 先生的杰作。
这个故事告诉我们一个道理,如果你是跨平台开发者,一定要用一个能简便更换换行符的开发工具!而且一些奇奇怪怪的问题,很有可能是因为换行符这样的小细节导致的!
vs code 里面虽然很不起眼,但是很重要的小功能
下一篇: 阿里云centos安装docker