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 属性。

相关推荐
我爱学习好爱好爱2 小时前
Elasticsearch 7.17.10 双节点集群部署实战(基于 Rocky Linux 9.6)
大数据·linux·elasticsearch
豆浆煮粉2 小时前
基于 Linux+CMake 从零集成 Lua 脚本引擎 (附 Sol2 避坑指南)
linux·lua
一直不明飞行2 小时前
C++ pari使用的两个注意事项
开发语言·c++
pop_xiaoli2 小时前
iOS-多线程原理
笔记·macos·ios·objective-c·cocoa
wefly20172 小时前
无需安装的 M3U8 在线播放器,快速实现 HLS 流预览与调试
java·开发语言·python·开发工具
飞Link2 小时前
深度解析:建模动作序列(Action Sequence Modeling)的实战指南
开发语言·python·数据挖掘
CoderCodingNo2 小时前
【GESP】C++六级/五级练习题 luogu-P1323 删数问题
开发语言·c++·算法
胡楚昊2 小时前
XSS LAB通关笔记(1-16)
前端·笔记·xss
We་ct2 小时前
LeetCode 211. 添加与搜索单词 - 数据结构设计:字典树+DFS解法详解
开发语言·前端·数据结构·算法·leetcode·typescript·深度优先