Linux 和 Windows 换行符的差异

in #cn6 years ago (edited)

昨天,又被 Windows 坑到了。

事情的背景是,我的工作环境是 Windows 操作系统。由于一些众所周知的原因,有些事情在 Linux 下做起来比较顺当。于是,我就用 virtualbox 装了个虚拟的 Ubuntu。由于不熟,只用到其中很小一部分功能,所以,凡是能在 Windows 下做的事情,我绝不去 Ubuntu。

昨天,我要写一批 bash 指令,打算在 Ubuntu 里运行。这批指令格式相同,只是内容略有不同。于是,我就动了点小心思,用 R 语言批量写好了 bash 指令的内容,最后用 writeLines() 函数生成了这批 .sh 文件。

前面我提到了,这些操作都是在 windows 下完成了。保险起见,我特地指定了 writeLines(useBytes = TRUE),来保证这批 .sh 文件的编码 UTF-8,心想这下应该没问题了吧。

但是,在 Ubuntu 里执行 这批 .sh 文件,居然出错!说什么文件找不到......

上面显示的这个 test.sh 文件,是我测试用的。我从这批运行失败的 .sh 文件里面随便拎出一个,里面删得只剩两条指令:

cd ~
ls

就这,居然还有错?

我记得在 Ubuntu 下直接写的 .sh 文件没这个问题啊。

那好,我就在 ubuntu 的文本编辑器里写了一个一模一样的文件,取名 test2.sh,内容也是只有这两条指令。然后运行,居然好了!

肉眼去看,两个文件都完全相同!我对比了一下两个文件的编码,都是 UTF-8。

这是遇见孙悟空和六耳猕猴了?

我拿出两面照妖镜:一个是 Totalcommander 的文本比较工具,一个是 notepad++ 的文本比较插件。比较的结果是,两个文件完全相同!

大惑不解。

使出浑身解数,都没有进展。万般无奈之下,想起这批 .sh 文件是用 R 的 writeLines()函数写的,那就去看看这个函数的帮助文件吧。

这一看,不打紧,竟发现一条惊人的线索。

Linux 的换行分隔符是LF, Windows 是 CRLF?

好像是有这么个印象。于是,我在 notepad++ 里打开了“显示所有符号”。

真相大白!

原来,因为我用 windows 下 R 语言的 writeLines()函数写的 .sh 文件,里面的换行符号是 CRLF,在 Linux 里执行时不认可,所以出现了错误。

F1 才是识别六耳猕猴的如来佛祖!

解决办法:同样的 R 代码,在 Linux 运行就可以了,生成的 .sh 文件没有任何问题。

谨以此文,纪念又一次被 windows 坑了一下。

Sort:  

这个确实是这样的,现在有很多IDE比较智能

下面是记忆中的事,不太肯定:
keil中有Linux和Windows换行符的转换功能。

下面是确定的事:

Notepad++中有转换的功能

Notepad++中有转换的功能

不过前提是要有知道他们不同的意识很重要。

意识很重要。notepad++ 的这个菜单我看过多次,不明所以,原来是干这个用的。谢谢提供的情报。

你把标题改成Linux vs Windows换行符的差异更好,我觉得对我来说这就是知识点!

你说得对,我照做。

你的机器人也太夸张了,这一天发了多少哈哈哈

测试期。你没看我标签都只贴了一个。

这知识,也就只能在鹏哥这里学到

问题是有个球用......

鹏哥应该被这个问题折腾了一些时间吧~

好几个小时 :.....)

两个操作系统各有各的优点,程序员一般更喜欢在linux下操作哈哈~

是的。作为小白,我还是习惯 windows。

linux 专业的程序猿会比较青睐 哈哈哈

可能你Windows用的少,我很久以前就被这个坑过了。当时还写了个小程序转换

Coin Marketplace

STEEM 0.32
TRX 0.11
JST 0.034
BTC 66654.57
ETH 3250.95
USDT 1.00
SBD 4.33