问题发现
当在windows平台中编写了一个自定义的shell脚本后,直接copy到Linux系统中执行时报错“bad interpreter: No such file or directory”。
原因分析
可以从报错信息中看到,在我们“/bin/bash”后跟了个“^M”,但我们并没有编写时并没有该字符,vim编辑也看不到。
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
看到的结果:
可以显示出不可见的“^M”。
同时我们file查看文件信息,如file nginx_rtmp.sh
如下结果:
可以看到,文件中存在CRLF的换行方式。
解决方案
1、vim重新编写
可以Linux下新建一个文件,重新vim直接编写脚本内容即可。当然。。。麻烦。。
2、windows下调整换行
当然这种方式仅针对换行符问题的情况,如果还有其他特殊字符不同系统兼容问题,另做考虑。
这里我的脚本是通过IDEA进行编写的,可以在编写时选择换行方式,IDEA支持不同的系统模式。
Notepad++也支持
应该大多数编辑器都是具有类似功能的。
3、Shell命令
dos2unix是将Windows格式文件转换为Unix的工具,直接如:dos2unix 后跟你的文件名 即可实现自动转换。非常方便!! yum install -y dos2unix
即可CentOS下安装dos2unix(其他发行版类似)。实际效果如下:
具体关于dos2unix的使用及原理,可自行百度。
可以再次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
发表评论