Linux fileformat error: bad interpreter: No such file or directory
背景
在windows下新建的sh文件,copy到linux下有的会报错,一般是格式问题
默认情况下windows格式会在段落末尾有CR、LF,但是Unix格式只有LF
示例
执行sh脚本文件
./file.sh -bash: ./file.sh: /bin/sh^M: 坏的解释器: 没有那个文件或目录 或者 报bad interpreter:No such file or directory错误
分析
起初只看到后面这部分,以为目录下面真的没有这个问题,但是通过 ls -al 查看是可以看到文件的,后面又以为是文件权限问题,查了下也不是,最后才留意到前面的 ^M
这个错误通常是由于 shell 脚本的换行符格式问题导致的。在 Windows 系统下编辑的文件可能会出现这种问题。^M 表示回车符,/bin/sh^M 这个错误提示表明脚本中包含了 Windows 格式的回车符。
方案
可以使用 dos2unix 命令将脚本文件转换为 Unix 格式的换行符。
对于 Debian/Ubuntu 系统,可以使用 apt 包管理工具进行安装:
sudo apt update sudo apt install dos2unix dos2unix yourfile
对于 Red Hat/CentOS 系统,可以使用 yum 包管理工具进行安装:
sudo yum install dos2unix dos2unix yourfile
对于 Fedora 系统,可以使用 dnf 包管理工具进行安装:
sudo dnf install dos2unix dos2unix yourfile
Alpine Linux系统,可以使用 apk 包管理工具进行安装:
apk update
apk add dos2unix
dos2unix yourfile
如果系统中没有安装 dos2unix,也可以手动转换文件格式:
# 使用 vi 编辑器转换格式 vi exts/jsonpath.sh :set fileformat=unix :set ff :wq
上述操作将会使用 vi 编辑器将文件格式转换为 Unix 格式,然后再次尝试执行脚本文件,应该就不会出现类似的报错了。
可以在文件中增加 set fileformat=unix 这段代码来告诉 vi 编辑器将文件格式转换为 Unix 格式。这样做的效果和通过命令行设置是一样的。这个方法可以确保在编辑保存文件时就已经转换了格式,方便快捷。
也可以把这个set命令写在sh文件里面
set ff=unix
或
set fileformat=unix
可以在使用 vi 编辑器打开文件后,在编辑模式下输入 :set fileformat=unix 命令,然后保存退出即可。这样就会将文件的换行符格式转换为 Unix 格式,从而避免类似的报错。
扩展
fileformat 这个变量都有哪些值
在 vi/vim 编辑器中,fileformat 变量用于指定文件的换行符格式,它可以有以下几种值:
unix:Unix 格式的换行符(LF,Line Feed) dos:Windows 格式的换行符(CRLF,Carriage Return + Line Feed) mac:旧版 Mac 格式的换行符(CR,Carriage Return)
可以根据需要设置文件的换行符格式,以便与当前环境和其他工具相兼容。通过设置正确的 fileformat 值,可以避免类似于换行符格式错误导致的问题。