美文网首页
祸起行尾符

祸起行尾符

作者: book_02 | 来源:发表于2020-12-01 16:31 被阅读0次

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

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

相关文章

  • 祸起行尾符

    不同平台行尾符不一样,有时候会导致一些问题。 1. 不同平台行尾符差异 平台行尾符C语言表示WindowsCRLF...

  • Windows和Linux 行尾符(EndOfLine)的区别

    不同操作系统,文本文件的行尾符是有区别的。 1. 各系统关于行尾符(End-of-Line)的规定** 2. 概念...

  • vim

    Hotkey d$ 删除光标处到行尾的内容J 删除当前行行尾换行符A 在当前行行尾添加内容:s/old/new/g...

  • -4- scala语句行尾分隔符

    scala行尾分隔符 Scala将行的结尾视为表达式的结尾,除非它可以推断表达式继续到下一行,常用的行尾推断分隔符...

  • 关于crlf

    Git学习笔记:Git设置CRLF(行尾换行符) git config --global core.autocrl...

  • Python3 - 使用分隔符或行终止符打印

    问题 使用 print() 函数输出数据,但是想改变默认的分隔符或者行尾符。 解决方案 在 print() 函数中...

  • 正则表达式匹配空行

    编辑器:notepad++ ^(\s*)\r\n 根据文档格式(windows, mac, linux行尾符)不同...

  • vim 使用技巧

    显示行末空格 将 tab 全部替换为空格 删除行尾空格 %s :在整个文件范围查找替换/ :分隔符\s:匹配空白符...

  • notepad++显示不可见字符

    Notepad++支持显示回车符,换行符,TAB键,行首,行尾等特殊字符 转载 2015年02月02日 17:37...

  • [vim] vim打开文件之后出现的^M是什么

    Windows下的换行符是:\r\n Linux/Unix下的换行符是:\n M就是就是在行尾显示的\r。之所以显...

网友评论

      本文标题:祸起行尾符

      本文链接:https://www.haomeiwen.com/subject/fjuswktx.html