Linux 中换行符问题

问题

Linux 环境执行一些脚本出错,查找原因,发现是文件在Windows环境修改并上传,格式被转换为MS-Dos格式(换行符不同),这样的文件在Linux中运行会出错(shell 解释器把换行符作为一个命令的提交)。

背景

很久以前,老式的电传打字机使用两个字符来另起新行。回车符(CR)把滑动架移回行首 ,换行符(LF)把纸上移一行 。

teletype.jpg

当计算机问世以后,存储器曾经非常昂贵。有些人就认定没必要用两个字符来表示行尾。

UNIX 用 <LF> 一个字符来表示行尾。

Apple 的MacOS 9 及以前用 <CR> ,MacOS 10跟Unix一样。

MS-DOS (以及Windows) 沿用老式的<CR><LF>,即敲一下回车键,相当于同时执行了 "回车+换行"。

总结一下:

系统 中文描述 英文描述 简写 转义符
Windows 回车换行 Carriage Return and Line Feed CRLF \n\r
Unix/Linux/Mac OS 换行 Line Feed LF \n

如果你把一个文件从一种系统移到另一种系统,那么你就有换行符方面的麻烦。

Windows10的记事本(notepad)能够自动识别Linux文件,但是在Linux中查看MS-DOS格式文件会发现每一行的末尾有个 ^M 字符。(^M 就是 <CR>)。

单个文件解决办法

Linux 环境下 vim 直接编辑修改文件。

:set fileformat=unix

或者

:set ff=unix

保存退出就解决了。

批量文件解决方案一

这是通用方案,核心逻辑是

  • 找出文件:用file命令查看文件是否有特殊换行符
  • 修改文件:dos2unix命令直接改。(也可以vi 文件修改,后面在举例)

具体例子

1. 检查文件

$ file ./test.yml
./test.yml: ASCII text, with CRLF line terminators

输出中看到了CRLF,这是Dos文件格式的标志。

2. 下一步,文件格式转换

$ dos2unix ./test.yml
dos2unix: converting file ./test.yml to Unix format ...

3. 检查文件是否真的修改了格式

$ file ./test.yml
./test.yml: ASCII text

发现没有CRLF 标志,修改完成。

4. 把上面的命令合并,查找并修改Dos格式文件

$ find . -type f -exec file {} \; | grep CRLF | awk -F: '{print $1}' | xargs dos2unix
dos2unix: converting file ./ansible/README.md to Unix format ...
...

or

$ find . -type f -exec file {} \; | grep CRLF | cut -d : -f 1 | xargs dos2unix

批量文件解决方案二

从 7.1 版本后,dos2unix 有 -i, --info 参数,能够直接获取文件换行符的信息,我们能直接用这个命令来查找和替换。-ic 参数表示只是打印需要转换的文件。

(MacOS 通过brew 可以安装 dos2unix version 7.4,而centos 7 和 ubuntu 16 默认只能安装版本6.0,更高版本需要自己单独下载安装包。)

$ dos2unix -i ./roy_test.yml
      11       0       0  no_bom    text    ./roy_test.yml
$ dos2unix -ic ./roy_test.yml
./roy_test.yml

上面的输出数字 11 表示有11个dos换行符。

查找并修改dos文件:

$ find . -type f -exec dos2unix -ic {} \; | xargs dos2unix
dos2unix: converting file ./bin/Readme.txt to Unix format...
...

如果文件数量大,用xargs 替换 exec 更有效率,所以更好的命令是

$ find . -type f | xargs dos2unix -ic | xargs dos2unix

Windows开发中避免换行问题

使用编辑器Visual Studio Code

这个工具的右下角的文件格式确保是LF。如果不是,就点击重新选择。

1567752511438.png

gitbash 中设置默认检入检出换行符为linux(\n)风格

(为了团队更好的协作)

开启自动换行
$ git config --global core.autocrlf true

git config --global core.autocrlf true 签出时将换行符转换成CRLF,签入时转换回 LF
git config --global core.autocrlf input 签出时不转换换行符,签入时转换回 LF
git config --global core.autocrlf false 签出签入均不转换

开启安全换行
$ git config --global core.safecrlf true

解释:
如果你把换行符搞乱了,在一个文件中既包含windows风格的换行符也包含unix风格换行符,那么 safecrlf 就可以发挥作用了:
git config --global core.safecrlf true 拒绝提交包含混合换行符的文件
git config --global core.safecrlf false 允许提交包含混合换行符的文件
git config --global core.safecrlf warn 提交包含混合换行符的文件时候给出警示

参考文档

不同平台windows、linux、mac 上换行符的问题

vim下unix和dos格式转换

NewLine Wikipedia

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容