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,脚本即可正常启动。
命令详解:
sed(Stream Editor)- 这是 Linux 下强大的流编辑器,用于对文本文件进行查找、替换、删除等操作。
-i(in-place)- 含义 :直接修改文件内容。
- 注意 :如果不加
-i,sed只会将修改后的结果输出到屏幕(终端),而不会改变原文件。加上-i才会真正把文件里的内容改了。
's/\r$//'(核心脚本部分)- 这是 sed 的替换指令,格式为
s/查找的内容/替换成的内容/。 s:Substitute(替换)。\r:代表 回车符 (Carriage Return) ,也就是报错信息里看到的^M。在 Windows 系统中,换行是由\r\n组成的,而 Linux 只需要\n。这个\r在 Linux 下就是多余的"垃圾字符"。$:这是一个正则表达式符号,代表 行尾 (End of line) 。- 组合起来
\r$的意思就是:"查找位于每一行末尾的回车符"。
- 组合起来
//:中间是空的,代表 替换为空(即删除)。
- 这是 sed 的替换指令,格式为
./script/*.sh(目标文件)./script/:指定目录。*.sh:通配符,表示匹配该目录下所有以.sh结尾的脚本文件。
4. 总结
跨平台开发注意换行符 :在 Windows 上使用 VS Code 开发 Linux 代码时,建议将底部状态栏的换行符设置从 CRLF 改为 LF,或配置 Git 的 core.autocrlf 属性。