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 值,可以避免类似于换行符格式错误导致的问题。

 

posted @ 2024-07-13 09:20  凌雨尘  阅读(16)  评论(0编辑  收藏  举报