sh脚本:解释器错误,没有那个文件或目录
部分参考:Error处理:/bin/bash^M: 坏的解释器: 没有该文件或目录(bad interpreter: No such file or directory)
感谢原创。
问题
在Linux下编译运行脚本的时候出现”/bin/bash^M: 坏的解释器: 没有那个文件或目录(bad interpreter: No such file or directory)“这样的错误。
解决方法
1
2
3
# 将脚本中的所有行结尾替换成'\n'
# 把script.sh中的行尾的\r替换为空白
sed -i 's/\r$//' script.sh
原因
- 文件在Windows下编辑过,在Windows下每一行结尾是\n\r,而Linux下则是\n
- 文件可能经过一系列的编码处理,比如:虚拟机中编辑文件,win上查看文件误保存等
- 上传到git上再下载下来,会不会有问题,尚且需要测试
在windows下编辑过的文件在linux下打开看的时候每一行的结尾就会多出来一个字符\r,用cat-A filename
时你可以看到这个\r字符被显示为^M。
PS:cat -A 什么意思?
A就是all的意思,就是所有的都显示出现,也就是说\n\r默认是不显示的。
这时候只需要删除这个字符就可以了。
在notepad++中查看win上的文件时,后缀显示的是CRLF;查看linux上的文件时,后缀显示的仅仅是LF。
sh脚本的第一行可以是
#!/bin/sh
,也可以是#!/bin/bash
,目前测试到的两个都可以使用。
正则表达式说明
表达式:sed-i 's/\r$//'filename
1
2
3
4
-i插入
s替代模式
\r$表示任何以\r结束的字符
整句意思是把以\r结束的字符换成空白