解决 Linux Bash 脚本因换行符问题导致的 “bash^M: No such file or directory“ 错误

一、问题重现

最近在部署一个 Bash 脚本时遇到一个诡异的问题:

```bash

$ chmod +x deploy.sh

$ ./deploy.sh

/usr/bin/env: 'bash\r': No such file or directory

```

明明脚本内容正确,权限也设置好了,为什么会出现这样的错误?

二、问题根源

经过排查发现,这个错误的根本原因是换行符格式问题:

  1. Windows 换行符(CRLF):`\r\n`(回车+换行)

  2. Unix/Linux 换行符(LF):`\n`(仅换行)

当脚本在 Windows 系统编辑后保存,会使用 CRLF 格式。而 Linux 系统只能识别 LF 格式,因此当它看到 `\r\n` 时:

• 把 `\r` 当作命令名的一部分(变成 `bash\r`)

• 系统找不到名为 `bash\r` 的命令,于是报错

三、解决方案

方法 1:使用 dos2unix 工具

最简单直接的方法是使用 `dos2unix` 工具转换换行符:

```bash

安装 dos2unix(如果未安装)

sudo apt-get install dos2unix # Ubuntu/Debian

sudo yum install dos2unix # CentOS/RHEL

转换文件

dos2unix deploy.sh

```

方法 2:使用 sed 命令

如果没有 dos2unix,可以用 sed 命令手动删除 `\r` 字符:

```bash

sed -i 's/\r$//' deploy.sh

```

方法 3:VS Code 编辑器转换

  1. 用 VS Code 打开脚本文件

  2. 右下角状态栏会显示当前换行符格式(CRLF 或 LF)

  3. 点击换行符标识,选择 "LF"

  4. 保存文件

四、如何验证换行符格式

检查文件换行符格式的方法:

```bash

方法 1:cat -v 命令

cat -v deploy.sh | head -n 1

如果输出中出现 ^M,则说明有 Windows 换行符

方法 2:file 命令

file deploy.sh

会显示 "with CRLF line terminators" 或 "ASCII text"

```

五、为什么换行符会造成问题?

  1. 历史原因:

• Windows 继承了 DOS 的 `\r\n` 换行格式

• Unix/Linux 使用简洁的 `\n` 换行格式

  1. 技术原理:

• `\r` 是回车(Carriage Return),把光标移回行首

• `\n` 是换行(Line Feed),把光标移到下一行

• Windows 要求两者配合使用,Unix/Linux 只需要 `\n`

相关推荐
聆风吟º1 小时前
CANN开源项目深度实践:基于amct-toolkit实现自动化模型量化与精度保障策略
运维·开源·自动化·cann
Coder个人博客2 小时前
Linux6.19-ARM64 mm mmu子模块深入分析
大数据·linux·车载系统·系统架构·系统安全·鸿蒙系统
较劲男子汉4 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
Doro再努力4 小时前
Vim 快速上手实操手册:从入门到生产环境实战
linux·编辑器·vim
wypywyp4 小时前
8. ubuntu 虚拟机 linux 服务器 TCP/IP 概念辨析
linux·服务器·ubuntu
风流倜傥唐伯虎5 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
Doro再努力5 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
senijusene5 小时前
Linux软件编程:IO编程,标准IO(1)
linux·运维·服务器
忧郁的橙子.5 小时前
02-本地部署Ollama、Python
linux·运维·服务器
醇氧5 小时前
【linux】查看发行版信息
linux·运维·服务器