不同操作系统换行符 CR, LF, CR/LF 的区别

675 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1. 测试

有时候在 Windows 电脑上编辑好的 shell 脚本上传到 Linux 服务器上执行会报错,下面测试一下。

在 Windows 电脑上使用 Editplus 文本编辑器编写一个测试脚本test.sh

#!/bin/sh

echo "测试一下"

printf "再测试一下"

上传到 Linux 服务器,使用sh test.sh执行,则会提示下面的错误:

[test@compute-15 test]$ rz -b
[test@compute-15 test]$ ll
总用量 4\
-r-------- 1 test test 60 9月  14 10:30 test.sh
[test@compute-15 test]$ chmod +x test.sh
[test@compute-15 test]$ ll
总用量 4\
-r-x--x--x 1 test test 60 9月  14 10:30 test.sh
[test@compute-15 test]$ sh test.sh
test.sh:行2: $'\r': 未找到命令
测试一下
test.sh:行4: $'\r': 未找到命令
再测试一下
[test@compute-15 test]$

这就是不同操作系统的换行符不同造成的。

2. 介绍

在文本处理中,CR(CarriageReturn 回车),LF(LineFeed 换行),CR/LF都表示换行符:

  • CR使用符号r表示,ASCII 代码是13,十六进制代码为0x0D
  • LF使用符号n表示,ASCII 代码是10,十六进制代码为0x0A

不同操作系统上使用的换行符不同,具体如下:

  • DOS 和 Windows 采用回车+换行CR/LF表示下一行,在文本文件中使用0d 0a两个字节表示。
  • MAC OS 系统采用回车符CR表示下一行,在文本文件中使用0d一个字节表示。
  • UNIX/Linux 采用换行符LF表示下一行,在文本文件中使用0a一个字节表示。

3. 补充

一般操作系统上的运行库都会自动决定文本文件的换行格式。如一个程序在 Windows 上运行就生成CR/LF换行格式的文本文件,而在 Linux 上运行就生成LF格式换行的文本文件。

在一个平台上使用另一种换行符的文件文件可能会带来意想不到的问题,特别是在编辑程序代码时。有时候代码在编辑器中显示正常,但在编辑时却会因为换行符问题而出错。很多文本/代码编辑器带有换行符转换功能,使用这个功能可以将文本文件中的换行符在不同格式间互换。

比如我在 Windows 中使用的 Editplus 文本编辑器就支持指定换行符:

1663124278366.png

image.png

在不同平台间使用 FTP 软件传送文件时,在 ASCII 文本传输模式下,一些 FTP 客户端程序会自动对换行格式进行转换。经过这种传输的文件字节数可能会发生变化。如果你不想 FTP 修改原文件,可以使用 bin 模式(二进制模式)传输文本。