一、"回车"(carriage return)和"换行"(line feed)的来历和区别
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打 10 个字符。
但是它有一个问题,就是打完一行换行的时候,要用去 0.2 秒,正好可以打两个字符。要是在这 0.2 秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。
一个叫做"回车",告诉打字机把打印头定位在左边界;
另一个叫做"换行",告诉打字机把纸向下移一行。
这就是"换行"和"回车"的来历,从它们的英语名字上也可以看出一二。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
Unix系统里,每行结尾只有"<换行>",即"\n";
Windows系统里面,每行结尾是"<回车><换行>",即"\r\n";
Mac系统里,每行结尾是"<回车>"。
一个直接后果是,Unix/Mac 系统下的文件在Windows里打开的话,所有文字会变成一行;
而 Windows 里的文件在 Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号,这多出来的 \r 被vim解释成了^M。
二、Linux中查看文件的换行符:
1、vim filename (:set list)
2、cat -T filenae 显示TAB键的字符^I
3、cat -E filename 显示行尾的结束字符$
4、cat -A filename 显示所有不可见的字符
三、Mac/Windows文本在 Linux 下的转换
解决的问题:
1、Windows下编写的 SH 脚本,放到 Linux下执行可能会出错。
2、Linux下新建的文档在Windows下用记事本打开内容会挤在一起(没有了换行符)。原因是记事本不支持\n换行(它只支持\r\n形式的换行)
1、dos2unix/mac2unix filename
2、sed 's/^M//' filename > tmp_filename
3、vim 命令行模式下
:set fileformat=unix
:set fileformat=dos
:set fileformat=mac
四、base64编码解码
➜ ~ echo 123|base64
MTIzCg==
➜ ~ echo -n 123|base64
MTIz
➜ ~
使用 echo 输出字符串时,如果没有 -n 参数会自动添加换行符,这会令 base64 编码出来的结果不符合预期。
比如在 k8s 中做 secret 的时候,添加加密变量的时候,如果没有使用 -n 去除换行符,在容器中便不能正常解码。