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)
    • 含义 :直接修改文件内容。
    • 注意 :如果不加 -i,sed 只会将修改后的结果输出到屏幕(终端),而不会改变原文件。加上 -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 属性。

相关推荐
时间的拾荒人14 分钟前
Qt 文件操作详解:从基础类到读写实战
开发语言·qt·面试
Wang's Blog24 分钟前
Java 项目实战: 外卖平台优化-YApi接口管理平台与文档导入导出
java·开发语言·yapi
2601_9672127227 分钟前
电源轨道系统核心技术路线对比与选型要点
大数据·经验分享
海绵宝宝转agent27 分钟前
leetCode100算法开源笔记分享
笔记·算法
jimy130 分钟前
基类没有虚析构函数,基类指针删除派生类对象,行为是未定义的
开发语言·c++
l1t34 分钟前
修复WSL CreateInstance/E_UNEXPECTED和 mounted read-only 错误
linux·windows·wsl
迅猛龙办公室39 分钟前
python获取星期字符串
开发语言·python
Ruiery41 分钟前
Linux 6.6内核 CPU 深度解析(九):时钟与 TSC — 内核怎么从 PIT/HPET 切到 TSC
linux·运维·服务器
吴声子夜歌1 小时前
Nginx应用与运维——Nginx日志管理
java·运维·nginx
老花眼猫1 小时前
数学艺术图案画-曼陀罗(93)
c语言·经验分享·青少年编程·课程设计