执行shell脚本报/bin/bash^M: bad interpreter错误的解决

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。


问题描述:

在notepad++里面编辑修改了shell脚本,再上传到服务器执行,出现"-bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory"的报错:

复制代码
[root@test102 ~]# ./test.sh 
-bash: ./test.sh: /bin/bash^M:  bad interpreter: No such file or directory
[root@test102 ~]# 

原因分析:

这个问题可能是因为脚本文件在windows下编辑过。就有可能被转换成Windows下的dos文本格式了,这样的格式每一行的末尾都是以\r\n来标识,它的ASCII码分别是0x0D,0x0A。如果你将这个脚本文件直接放到Linux上执行就会报/bin/bash^M: bad interpreter错误提示。
windows下,每一行的结尾是\n\r,而在linux下文件的结尾是\n,
那么你在windows下编辑过的文件在linux下打开看的时候每一行的结尾就会多出来一个字符\r。

用cat -A file.sh时你可以看到这个\r字符被显示为^M,这时候只需要删除这个字符就可以了。

可以使用命令sed -i 's#\r$##g' file.sh

解决方法1------修改换行符:

1、查看脚本文件的换行符,果然是多个^M:

复制代码
[root@test102 ~]# cat -A test.sh 
#!/bin/bash^M$
   touch /home/test1^M$
   echo "test1" >>/home/test1^M$
   echo "test2" >>/home/test1^M$
   ^M$
   [root@test102 ~]#

2、替换换行符:

复制代码
[root@test102 ~]# sed -i 's#\r$##g' test.sh 

3、检查修改后的文件,换行符已经替换OK,换行符已经是$了:

复制代码
[root@test102 ~]# cat -A test.sh 
#!/bin/bash$
   touch /home/test1$
   echo "test1" >>/home/test1$
   echo "test1" >>/home/test1$
   $
[root@test102 ~]# 

4、执行脚本,OK了

复制代码
[root@test102 ~]# ./test.sh 
[root@test102 ~]# 
[root@test102 ~]# cat /home/test1 
test1
test1
[root@test102 ~]# 

注意:

最然使用cat -A看到的换行符是^MKaTeX parse error: Expected 'EOF', got '#' at position 26: ...时候不能用 sed -i 's#̲\^M##g' test.sh 来替换,替换不成功的:

复制代码
[root@test102 ~]# sed -i 's#\^M$##g' test.sh 
[root@test102 ~]# 
[root@test102 ~]# 
[root@test102 ~]# ./test.sh 
-bash: ./test.sh: /bin/bash^M:  bad interpreter: No such file or directory   #同样无法执行
[root@test102 ~]# 
[root@test102 ~]# 
[root@test102 ~]# cat -A test.sh          #cat -A查看文件会发现文件换行符其实没有改成功的
#!/bin/bash^M$
   touch /home/test1^M$
   echo "test1" >>/home/test1^M$
   echo "test1" >>/home/test1^M$
   ^M$
[root@test102 ~]# 
[root@test102 ~]# 

解决方法2------修改文本格式:

用vim命令打开要检查的脚本文件,然后用

:set ff?

命令检查一下,看看是不是dos字样,如果是dos格式的,继续执行

:set ff=unix

然后执行

:qw

保存退出即可:

执行结果发现文本格式真的是dos的格式:

然后用命令:set ff=unix修改:

修改之后格式变成了unix:

然后保存退出,执行脚本就OK了:

复制代码
[root@test102 ~]# ./test.sh 
[root@test102 ~]# 
[root@test102 ~]# 
[root@test102 ~]# cat /home/test1 
test1
test1
[root@test102 ~]# 

解决方法3------转码后上传:

后来在notepad++里面找了一下,发现用notepad++编辑的话,编辑完了之后检查一下格式,转成UNIX格式之后保存,上传到服务器运行就好啦。

相关推荐
Brookty1 小时前
Java线程安全与中断机制详解
java·开发语言·后端·学习·java-ee
從南走到北2 小时前
JAVA东郊到家按摩服务同款同城家政服务按摩私教茶艺师服务系统小程序+公众号+APP+H5
android·java·开发语言·微信小程序·小程序
遇见尚硅谷3 小时前
C语言:20250728学习(指针)
c语言·开发语言·数据结构·c++·笔记·学习·算法
☆璇3 小时前
【C++】C/C++内存管理
c语言·开发语言·c++
愿你天黑有灯下雨有伞3 小时前
枚举策略模式实战:优雅消除支付场景的if-else
java·开发语言·策略模式
网络安全打工人3 小时前
CentOS7 安装 rust 1.82.0
开发语言·后端·rust
楚轩努力变强3 小时前
前端工程化常见问题总结
开发语言·前端·javascript·vue.js·visual studio code
梦想的初衷~3 小时前
MATLAB近红外光谱分析技术及实践技术应用
开发语言·支持向量机·matlab
Fly-ping4 小时前
【前端】JavaScript文件压缩指南
开发语言·前端·javascript
铭哥的编程日记4 小时前
《C++ list 完全指南:从基础到高效使用》
开发语言·c++·list