linux运行脚本出现错误信息 /bin/bash^M: bad interpreter解决方法

linux运行脚本出现错误信息 /bin/bash^M: bad interpreter解决方法

1. 现象描述

运行构建脚本 ./script/build_project.sh,出现以下错误:

bash 复制代码
aiec@RK3588:~/Desktop/codews/remotedriving-videocapture$./script/build_project.sh 
bash: ./script/build_project.sh: /bin/bash^M: bad interpreter: No such file or directory

2. 原因分析

这是非常经典的 换行符格式问题

  • Windows 格式 (CRLF) :回车符是 \r\n
  • Linux/Unix 格式 (LF) :回车符是 \n

该脚本是在 Windows 环境下编辑(例如 VS Code 默认配置或记事本),然后传输到 Linux 板子上的。Linux 系统将行尾的 \r (显示为 ^M) 当作了文件名的一部分,试图去寻找 /bin/bash\r 这个解释器,导致找不到文件。

3. 解决方法

使用 Linux 自带的 sed 命令一键修复目录下所有脚本的格式。

在终端执行:

bash 复制代码
# 语法:sed -i 's/\r$//' 文件名
sed -i 's/\r$//' ./script/*.sh

执行该命令后,再次运行 ./script/build_project.sh,脚本即可正常启动。

命令详解:

  1. sed (Stream Editor)
    • 这是 Linux 下强大的流编辑器,用于对文本文件进行查找、替换、删除等操作。
  2. -i (in-place)
    • 含义直接修改文件内容
    • 注意 :如果不加 -ised 只会将修改后的结果输出到屏幕(终端),而不会改变原文件。加上 -i 才会真正把文件里的内容改了。
  3. 's/\r$//' (核心脚本部分)
    • 这是 sed 的替换指令,格式为 s/查找的内容/替换成的内容/
    • s:Substitute(替换)。
    • \r :代表 回车符 (Carriage Return) ,也就是报错信息里看到的 ^M。在 Windows 系统中,换行是由 \r\n 组成的,而 Linux 只需要 \n。这个 \r 在 Linux 下就是多余的"垃圾字符"。
    • $ :这是一个正则表达式符号,代表 行尾 (End of line)
      • 组合起来 \r$ 的意思就是:"查找位于每一行末尾的回车符"
    • // :中间是空的,代表 替换为空(即删除)。
  4. ./script/*.sh (目标文件)
    • ./script/:指定目录。
    • *.sh :通配符,表示匹配该目录下所有以 .sh 结尾的脚本文件。

4. 总结

跨平台开发注意换行符 :在 Windows 上使用 VS Code 开发 Linux 代码时,建议将底部状态栏的换行符设置从 CRLF 改为 LF,或配置 Git 的 core.autocrlf 属性。

相关推荐
懒鸟一枚7 分钟前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
GJGCY26 分钟前
财务智能体落地实践:RPA、大模型与规则引擎如何构建业财自动化闭环?
经验分享·ai·自动化·财务·智能体
YUS云生1 小时前
Python学习笔记·第31天:FastAPI入门——路由、路径参数、查询参数与请求体
笔记·python·学习
玖玥拾1 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
铅笔侠_小龙虾1 小时前
Rust 学习目录
开发语言·学习·rust
Darkwanderor2 小时前
对Linux的进程控制的研究
linux·运维·c++
云泽8082 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
灯澜忆梦2 小时前
GO---可见性规则
开发语言·golang
逝水无殇2 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
一个有温度的技术博主3 小时前
【VulnHub 实战】DC-1 靶机渗透测试笔记(一):信息收集与主机发现
服务器·网络·笔记