浅谈Windows下的CRLF(\r\n)在Linux系统下带来的问题

在协助客户实现一个功能的时候,有一个文件在windows下用Sublime编辑完后,直接复制到Linux下使用,结果导致了死机问题。

排解了一个晚上都没找到原因,虽然想到是不同系统格式的问题,只是之前Sublime这么用都正常,也就一直没深挖。

虽然最后问题解决了,还是要在这里总结下,以免重蹈覆辙。

CRLF的意思就是回车(CR, ASCII 13, \r) 换行(LF, ASCII 10, \n),这两个ACSII字符不会在屏幕有任何输出,在Windows中用来标识一行的结束。

Linux/UNIX系统中只有换行符(LF, ASCII 10, \n)。

在windows下编辑的文件可用dos2unix命令转换:

$dos2unix allcast.conf
dos2unix: converting file allcast.conf to UNIX format ...

如何检查文件是CRLF结尾,还是Linux的\n结尾,可以用命令file:

下面的表示CRLF结尾:

file version.conf
version.conf: ASCII text, with CRLF line terminators

下面的表示是LF(\n)结尾:

$file allcast.conf
allcast.conf: ASCII text

那为什么Sublime会出现这样的问题呢?

打开Perference->Setting-default中找到default_line_ending,这个参数有三 个可用选项:system,windows,unix,system是根据当前系统情况设置,windows使用的
CRLF,unix使用的是 LF。按你的情况,应该把Setting-User中设
置"default_line_ending":"unix"就可以解决这个问题不会乱改原文件的换行符了。

如下所示:

    // Determines what character(s) are used to terminate each line in new files.
// Valid values are 'system' (whatever the OS uses), 'windows' (CRLF) and
// 'unix' (LF only).
"default_line_ending": "unix",

发表回复