不同平台行尾符不一样,有时候会导致一些问题。
1. 不同平台行尾符差异
平台 | 行尾符 | C语言表示 |
---|---|---|
Windows | CRLF | \r\n |
Linux | LF | \n |
Mac | 先是CR,后改为LF | 先\r 后\n
|
- 不同平台行尾符不同
- Line Feed(LF,换行)
- Carriage Return(CR,回车)
- Linux之所以采用
\n
,是因为两个行尾符导致信息冗余,造成存储空间浪费,在存储容量较小的过去显然是很划不来的 - 在linux下打开windows编辑换行过的文件,就会在行末尾显示^M
hello^M$
world
windows下怎么查看使用的是哪种行尾符?
可参考"vs突然遇到莫名其妙的编译错误_不同平台换行符导致"(https://www.jianshu.com/p/cc749d85911d)
git在安装的时候会提示用户选择一种行尾符策略

选择之后也可以通过下面的命令来修改
git config --global core.autocrlf true
一般而言:
- 如果是单平台开发,则设置
autocrlf
为false
,不做行尾符的转换,该怎么样就怎么样。 - 如果是跨平台开发,则Windows端设置
autocrlf
为true
,linux端设置autocrlf
为false
,保证两端都可以使用。 - 可添加.gitattributes文件,只对该转换的文本文件进行转换,其他保持原样
2. 行尾符差异导致的问题
一个例子如下:
在windows上写脚本文件test.py
如下:
#!/usr/bin/python
print("hello world")
在windows上可以正常执行,然后拷贝到linux下,给执行权限,然后执行
chmod +x test.py
./test.py
会报错如下:
bash: ./test.py: /usr/bin/python^M: bad interpreter: No such file or directory
- 用
python test.py
倒是可以正常运行,因为已经指定解释器了 - 而
./test.py
需要根据第一行自己去找,结果第一行解析错了,所以无法执行
用cat -A test.py
去查看,看到^M字样
#!/usr/bin/python^M$
print("hello world")
所以这是Windows的行尾符在linux下造成脚本无法执行的问题。
这是Windows的CRLF
在linux下导致错误的情况,也有linux的LF
在windows的vs编译器上编译不过的情况,不过很少遇到。
3. 怎么转换行尾符
使用unix2dos
和dos2unix
来相互转换,用法如下:
unix2dos filename
dos2unix filename
所以上面dos2unix test.py
之后./test.py
便可顺利执行。
dos2unix
程序有linux版本和Windows版本。
ubuntu可如下快速安装
sudo apt-get install dos2unix
4. 参考
Windows和Linux 行尾符(EndOfLine)的区别
https://blog.csdn.net/timberwolf_2012/article/details/28687477
\r和\n行尾符引发的思考
http://www.createarttechnology.com/blog/article/78
由于Windows和Linux行尾标识引起脚本无法运行的解决
https://www.cnblogs.com/freeweb/p/5194614.html
网友评论