今天,在提交shell脚本的时候,出现了以下错误:也就是#!/bin/bash - no such file or directory
但是我确定这个错误不是由于我代码的问题,网上找到了解决问题的办法,参考https://unix.stackexchange.com/questions/27054/bin-bash-no-such-file-or-directory
首先检查脚本:
head -1 yourscript | od -c
0000000 357 273 277 # ! / u s r / b i n / e n
0000020 v b a s h \n
0000027
发现是错误的,然后再用
sed -i '1s/^.*#//;s/\r$//' qc3.sh
成功去掉错误的符号,再次检查一下,没有问题,符合正确的
[qiany@gm112-2 code]$ head -1 qc3.sh | od -c
0000000 ! / u s r / b i n / e n v b a
0000020 s h \n
0000023
脚本再次运行,也没有出现错误!完美解决。
思考为什么会出现这个问题呢?
原因一:文件开头有BOM;
linux上是无视BOM的,在linux上生成的文件也是不带BOM,但是在window下,windows记事本默认会给文件添加BOM头,尽管这几个字符正常情况肉眼不可见,但是在程序处理这些文件时,这些字符是能被识别到的,所以经常会出现看似正常的文件,程序处理却报错,以及window上看似正确的脚本在Linux下执行却报错。
原因二:第一行末尾有一个回车键
想知道是哪个原因,运行一下
head -1 qc3.sh | od -c
#scriptWithBom:有BOM
0000000 357 273 277 # ! / b i n / b a s h \n
#scriptWithCRLF: 有回车
0000000 # ! / b i n / b a s h \r \n
其实出现这种问题的最根本的原因就是windows和unix下格式的不对等。最根本的解决方法是,在windows下写脚本的时候转化成unix格式。在Sublime text中,是在view中的Line Endings
在Notepad++中是在编辑中的文档格式转换
但是在Notepad++中转化之后仍然出现问题。所以我后来直接选择在Linux下操作。
Linux中最简单的方法是dos2unix,不过这个命令需要安装dos2unix这个软件。