阿毛
It's me !
想你所想
解决执行自定义脚本过程中“bad interpreter: No such file or directory”的异常

问题发现

当在windows平台中编写了一个自定义的shell脚本后,直接copy到Linux系统中执行时报错“bad interpreter: No such file or directory”。

https://file.blog.humh.cn/2020/05/图片.png

原因分析

可以从报错信息中看到,在我们“/bin/bash”后跟了个“^M”,但我们并没有编写时并没有该字符,vim编辑也看不到。

https://file.blog.humh.cn/2020/05/图片-1.png

cat 也看不到。一头雾水,经面向搜索引擎后,发现“^”实则为Unix下的控制字符插入符号,而“M”为回车符(\r,CR)经ASCII编码转义后的字符(貌似,是“\r”十六进制表示+64转换为ASCII码表示后的结果,更具体我也没理解。。待考究)。但其实Unix系统中是不需要回车符的。我们在windows系统中,默认换行时,都会在其最后加入“\r\n”,即回车换行(CRLF)。但Unix系统中只需要“\n”即可以换行。这也就导致了我们经常在windows下编写的文件直接放到Linux系统中执行错误的原因。

像这种符号,在vim及默认cat中是看不到的,要想看到可以 cat -v(或者-e,-t)三个参数均可以显示出非打印字符,可以显示那些不可见的字符集,当然三个参数有略微不同,主要为能显示出的不同字符集范围不同。如下为cat -v看到的结果:

https://file.blog.humh.cn/2020/05/图片-2.png

可以显示出不可见的“^M”。
同时我们file查看文件信息,如file nginx_rtmp.sh如下结果:

https://file.blog.humh.cn/2020/05/图片-3.png

可以看到,文件中存在CRLF的换行方式。

解决方案

1、vim重新编写

可以Linux下新建一个文件,重新vim直接编写脚本内容即可。当然。。。麻烦。。

2、windows下调整换行

当然这种方式仅针对换行符问题的情况,如果还有其他特殊字符不同系统兼容问题,另做考虑。
这里我的脚本是通过IDEA进行编写的,可以在编写时选择换行方式,IDEA支持不同的系统模式。

https://file.blog.humh.cn/2020/05/图片-4.png

Notepad++也支持

https://file.blog.humh.cn/2020/05/图片-5.png

应该大多数编辑器都是具有类似功能的。

3、Shell命令

dos2unix是将Windows格式文件转换为Unix的工具,直接如:dos2unix 后跟你的文件名 即可实现自动转换。非常方便!! yum install -y dos2unix即可CentOS下安装dos2unix(其他发行版类似)。实际效果如下:

https://file.blog.humh.cn/2020/05/图片-6.png

具体关于dos2unix的使用及原理,可自行百度。

https://file.blog.humh.cn/2020/05/图片-7.png

可以再次file或者cat -v可以发现已不存在“\r”。


相关参考:
https://www.cnblogs.com/kerrycode/archive/2015/12/22/5065356.html
https://www.linuxidc.com/Linux/2018-10/154724.htm
https://www.cnblogs.com/kerrycode/p/5077969.html

首页      code      Linux      解决执行自定义脚本过程中“bad interpreter: No such file or directory”的异常

发表评论

textsms
account_circle
email

想你所想

解决执行自定义脚本过程中“bad interpreter: No such file or directory”的异常
问题发现 当在windows平台中编写了一个自定义的shell脚本后,直接copy到Linux系统中执行时报错“bad interpreter: No such file or directory”。 原因分析 可以从报错信息中…
扫描二维码继续阅读
2020-05-06