当前位置: 首页 > news >正文

解决 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` 换行格式


2. 技术原理:
   • `\r` 是回车(Carriage Return),把光标移回行首

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

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

相关文章:

  • es快速上手(从MySQL角度)
  • Java 进阶 1.0.1
  • Java高频面试之并发编程-18
  • 五分钟本地部署大模型
  • “星睿O6”AI PC 开发套件评测: NPU 算力测评(1)
  • MySQL 锁机制深度剖析:全局锁、表锁与行锁
  • 如何从容应对面试?
  • 大模型小课堂开课啦!!!
  • yolo模型优化【上下文标注】
  • HJ3 明明的随机数【牛客网】
  • 常见提示词攻击方法和防御手段——提示词越狱
  • 同一颗太阳:Australia、Austria、Arab、Africa、Augustus、August、Aurora、Athena
  • LeetCode 1306. 跳跃游戏 III(中等)
  • 网络-MOXA设备基本操作
  • Python测试单例模式
  • ubuntu系统 | dify+ollama+deepseek搭建本地应用
  • gcc: attribute: packed
  • FEKO许可证与多用户共享
  • day 21 常见降维算法
  • CPP之动态内存管理以及模板初阶
  • 重庆对外经贸学院通报:一学生在体育课后不慎坠入化粪池,不幸遇难
  • 申伟强任上海申通地铁集团有限公司副总裁
  • 梅花奖在上海|秦海璐:演了15年《四世同堂》,想演一辈子
  • 刘小涛任江苏省委副书记
  • 贵州仁怀通报“正新鸡排鸡腿里全是蛆”:已对同类产品封存送检
  • 张国清将赴俄罗斯举行中俄“长江—伏尔加河”地方合作理事会第五次会议和“东北—远东”政府间合作委员会双方主席会晤