linux执行sh文件bash: ./a.sh: /bin/bash^M: bad interpreter: No such file or directory

750

最近在家远程办公,就在自己的电脑上搭建了一套开发环境,但是在本地环境写好shell文件发布到linux服务器上时运行就会报错:

bash: ./a.sh: /bin/bash^M: bad interpreter: No such file or directory

然后就百度找到解决方案:

vi a.sh
:set ff=unix
:wq

但是下次部署shell文件又会出现上面的报错,那么怎么才能彻底根治这个问题呢?通过google查找资料终于搞明白了这个问题的来龙去脉:

vi a.sh
:set ff
fileformat=dos

通过上面的命令查出来fileformat=dos,需要改成fileformat=unix才能正常运行。dos格式文件传输到centos系统时,会在每行的结尾多一个^M,即dos文件中的换行符“\r\n”会被转换为unix文件中的换行符“\n”,而此文件若是一个可执行文件的话,会导致此文件不能被执行。这样的话我们就得从创建文件的时候排查问题,我是用Phpstorme创建的文件,最终查到是Phpstorme编辑器Line Separators设置问题:

通过File -> Settings -> Editor -> Code Style将Line Separators设置成LF-Unix and macOS(\n)保存后,通过编辑器创建新文件的Line Separators就是LF-Unix and macOS(\n)。