具体表现包括但不限于:

  • 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 识别不了。