sh脚本:解释器错误,没有那个文件或目录

本质是编码格式的问题

Posted by 雯饰太一 on November 6, 2023

sh脚本:解释器错误,没有那个文件或目录

部分参考:Error处理:/bin/bash^M: 坏的解释器: 没有该文件或目录(bad interpreter: No such file or directory)

感谢原创。

问题

在Linux下编译运行脚本的时候出现”/bin/bash^M: 坏的解释器: 没有那个文件或目录(bad interpreter: No such file or directory)“这样的错误。

解决方法

1
2
3
# 将脚本中的所有行结尾替换成'\n'
# 把script.sh中的行尾的\r替换为空白
sed -i 's/\r$//' script.sh

原因

  • 文件在Windows下编辑过,在Windows下每一行结尾是\n\r,而Linux下则是\n
  • 文件可能经过一系列的编码处理,比如:虚拟机中编辑文件,win上查看文件误保存等
  • 上传到git上再下载下来,会不会有问题,尚且需要测试

在windows下编辑过的文件在linux下打开看的时候每一行的结尾就会多出来一个字符\r,用cat-A filename时你可以看到这个\r字符被显示为^M。

PS:cat -A 什么意思?

A就是all的意思,就是所有的都显示出现,也就是说\n\r默认是不显示的。

这时候只需要删除这个字符就可以了。

在notepad++中查看win上的文件时,后缀显示的是CRLF;查看linux上的文件时,后缀显示的仅仅是LF。

sh脚本的第一行可以是#!/bin/sh,也可以是#!/bin/bash,目前测试到的两个都可以使用。

正则表达式说明

表达式:sed-i 's/\r$//'filename

1
2
3
4
	-i插入
	s替代模式
	\r$表示任何以\r结束的字符
	整句意思是把以\r结束的字符换成空白