在 Linux 系统中,当执行一个在 Windows 或 DOS 系统修改郭的 sh 脚本文件,,可能会报错:/bin/bash^M: 坏的解释器: 没有那个文件或目录 ,如下所示:

在这里插入图片描述

这是因为 Windows 和 Linux 系统对文本文件的换行符有不同的约定:

  • Windows 使用 回车(CR,十六进制是0xD) + 换行(LF,十六进制是0xA)组合(\r\n);
  • Linux 只使用 换行(LF,十六进制是0xA)

^M0xD 在 Vim 中的显示,0x0D = 13,M是英语中的第 13 个字符。

1.vim查看^M

方式一:查看^M【推荐】

vim 中查看 ^M 命令:

:e ++f=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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐