具体表现包括但不限于:
- c 程序的 printf 只要涉及到 \n 字符替换,其输出就是乱的、命令行 grep 后缀匹配无法输出正确的结果。
- 运行脚本时出错,例如运行
./test.sh
时报错bad interpreter
(一个例子是 /bin/bash^M: no such file or directory)。这里的 ^M 实际上就是\r
的命令行可视化表示,在 linux 中的脚本解释器默认只识别\n
结尾,所以\n
之前的\r
会被纳入命令的一部分,所以就会出现各种各样的稀奇错误,比如这里作为一个可执行程序的后缀导致了 not found 错误。
一般发现这个问题的可能是正在使用 wsl 的用户。罪魁祸首是 linux 的换行符是 \n
,而 Windows 的换行符是 \r\n
。
# Solution
可以在 linux terminal 中通过 cat -A
来检查换行符:
$ cat -A a.txt
this$
is$
a$
sample$
如果输出如上则代表是正常的 unix 换行格式,而如果每行的结尾是 ^M$
而不是 $ 的话,则说明是 Windows 的文本格式(dos)。
使用以下命令来转换格式:
# 如果还没安装记得安装:
$ sudo apt update
$ sudo apt install dos2unix
# 格式转换:
$ dos2unix a.txt
# 个人发现过程
看这里:
https://stackoverflow.com/questions/78283343
简单的说就是我把单个 \n 字符替换成 \0,剩下一个 \r 导致 linux shell 的 stdout 识别不了。