目录
在 Linux 系统中,当执行一个在 Windows 或 DOS 系统修改郭的 sh
脚本文件,,可能会报错:/bin/bash^M: 坏的解释器: 没有那个文件或目录
,如下所示:
这是因为 Windows 和 Linux 系统对文本文件的换行符有不同的约定:
- Windows 使用
回车(CR,十六进制是0xD)
+换行(LF,十六进制是0xA)
组合(\r\n
); - Linux 只使用
换行(LF,十六进制是0xA)
。
^M
是 0xD
在 Vim 中的显示,0x0D = 13
,M是英语中的第 13 个字符。
1.vim查看^M
方式一:查看^M【推荐】
vim 中查看 ^M
命令:
:e ++ff=unix %
方式二:查看文件格式
我们也可以通过查看文件格式进行判断,执行如下命令:
:set ff?
- 如果显示为
fileformat=dos
,则说明这是一个以DOS/Windows
格式保存的文件。
方式三:使用 cat 命令
如果文件内容不多的情况下,我们可以使用如下 cat 命令来查看 ^M
字符。
2.vim删除^M
方式一:手动删除
我们前面通过方式一执行 :e ++ff=unix %
已经查看到了 ^M
,符号,通过 i
编辑文本文件,删除 ^M
之后,:wq
保存并退出即可。
(注意:^M
看似两个字符,其实是一个字符,按一次删除按钮即可。)
方式二:批量替换
如果文件内容较多,通过 :e ++ff=unix %
查看 ^M
之后,手动删除会比较耗费时间,我们可以执行如下命令来进行批量删除:
:%s/\r//g
或者也可以这样:(注意:命令中 ^M
的输入方式是 Ctrl + V,然后 Ctrl + M)
补充:MobaXterm 终端工具中 Ctrl + M,已经被占用了,需要在 Settings -> Keyboard shortcuts 中换一下。
:%s/^M//g
方式三:修改文件格式
前面1.vim查看^M 中已经介绍过,我们可以通过 :set ff?
查看文件格式,那么我们也可以通过直接修改文件格式的方式来删除 ^M
字符。
:set ff=unix
下面为完整写法:
:set fileformat=unix
再次使用 set ff?
命令查看文件格式已经被修改为 unix
。
脚本文件可以正常执行了:
方式四:dos2unix 命令【推荐】
直接执行 dos2unix 文件名
可以将文件转为 unix
版本,删除里面所有的 ^M
:
dos2unix
整理完毕,完结撒花~ 🌻
参考地址:
1.史上最全的Vim命令,https://blog.csdn.net/scaleqiao/article/details/45153379
2.Linux下去掉^M的四种方法,https://blog.csdn.net/u012678323/article/details/132741008