这种错误只能说是坑,若是没有见到过,极可能就要摔里头。解决问题是重要的,但弄明白问题的来源,每每更为重要。linux
因此要先扯一下,换行和回车的历史遗留问题。shell
在计算机出现以前,有个玩意叫电传打字机。每秒钟能够打10个字符,可是在打完一行须要换行时,要用去0.2s。windows
这正好能够打2个字符,这段时间里若是有字符传过来,那么这些字符将被丢失。spa
很显然,要解决这个问题,最简单的办法就是浪费这个0.2s。同时,咱们在写东西时,要把手换到下一行及每行的首位置,也就是说这是两个动做。操作系统
天然而然地,研发人员在每一行后面添加了两个表示结束的字符(回车+换行)。unix
所谓“回车”:让打字机的打印头从新回到一行的首位置(左边界);所谓“换行”:让打字机把纸向下移一行。blog
后来,计算机来了,操做系统也来了。因而,坑也来了。不一样的操做系统对这个机器的“复位+走纸”的表示是不一样的:ci
OStable |
表示im |
C语言/转义字符 |
HEX表示 |
Windows |
回车+换行(CR/LF) |
\r\n |
0x0d0a |
Unix/Linux |
换行(LF) |
\n |
0x0a |
Mac OS |
回车(CR) |
\r |
0x0d |
因而,unix/mac下的文件若是在windows里打开,全部文字会变成一行;而windows的文件在unix/mac下打开,每行的结尾会多出一个 ^M 符号。
我想在linux下执行一个shell脚本,而它恰巧又在windows中打开过,因而我就狠狠地摔在了这个坑里。解决的办法天然很简单,一个dos2unix命令便可。