祸起行尾符

2020-12-01  本文已影响0人  book_02

不同平台行尾符不一样,有时候会导致一些问题。

1. 不同平台行尾符差异

平台 行尾符 C语言表示
Windows CRLF \r\n
Linux LF \n
Mac 先是CR,后改为LF \r\n
  1. 不同平台行尾符不同
  2. Line Feed(LF,换行)
  3. Carriage Return(CR,回车)
  4. Linux之所以采用\n,是因为两个行尾符导致信息冗余,造成存储空间浪费,在存储容量较小的过去显然是很划不来的
  5. 在linux下打开windows编辑换行过的文件,就会在行末尾显示^M
hello^M$
world

windows下怎么查看使用的是哪种行尾符?
可参考"vs突然遇到莫名其妙的编译错误_不同平台换行符导致"(https://www.jianshu.com/p/cc749d85911d)

git在安装的时候会提示用户选择一种行尾符策略


选择之后也可以通过下面的命令来修改

git config --global core.autocrlf true

一般而言:

  1. 如果是单平台开发,则设置 autocrlffalse,不做行尾符的转换,该怎么样就怎么样。
  2. 如果是跨平台开发,则Windows端设置 autocrlftrue,linux端设置autocrlffalse,保证两端都可以使用。
  3. 可添加.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
  1. python test.py倒是可以正常运行,因为已经指定解释器了
  2. ./test.py需要根据第一行自己去找,结果第一行解析错了,所以无法执行

cat -A test.py去查看,看到^M字样

#!/usr/bin/python^M$
print("hello world")

所以这是Windows的行尾符在linux下造成脚本无法执行的问题。

这是Windows的CRLF在linux下导致错误的情况,也有linux的LF在windows的vs编译器上编译不过的情况,不过很少遇到。

3. 怎么转换行尾符

使用unix2dosdos2unix来相互转换,用法如下:

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

上一篇 下一篇

猜你喜欢

热点阅读