修复:Linux 中的“Bad Interpreter: No Such File or Directory”错误

已发表: 2023-05-01
在 Cherry KW 9200 迷你键盘上打字的人
汉娜史崔克 / How-To Geek
如果在运行 shell 脚本时出现“错误的解释器:没有这样的文件或目录”错误,则需要将脚本文件从 Windows 转换为 Unix 行尾。 一种方法是使用dos2unix命令,如下所示:

dos2unix script1.sh

您是否尝试运行 Bash 脚本并收到“/bin/bash^M:错误的解释器:没有这样的文件或目录”的错误消息? 输出不是很有帮助,几乎给人的印象是您的脚本丢失了。 幸运的是,情况并非如此,修复非常简单。

目录

什么是“糟糕的解释器:没有这样的文件或目录”错误?
如何修复“Bad Interpreter: No Such File or Directory”错误
使用 dos2unix 命令
使用 tr 命令
使用 sed 命令
使用 vi 或 vim
使用 Geany
使用 Kate 或 Kwrite
使用记事本++
使用 VS 代码

什么是“糟糕的解释器:没有这样的文件或目录”错误?

收到一条错误消息,内容为/bin/bash^M: bad interpreter: No such file or directory仅表示您的 shell 脚本文件的行尾错误 - 位于行尾的字符表示是时候移至下一行。 DOS-descended Windows 喜欢看到一个“回车和换行”(CRLF)终止符,记为\r\n 。 相比之下,Linux、现代 macOS 和其他基于 Unix 的系统仅使用“换行符”(LF) 或\n

如果您看到这个错误的解释器错误,很可能是您或您的脚本最初是在 Windows 计算机上编写的。 Bash 看到 Windows 计算机设置的那些\r\n行结尾并感到不安,因为它们阻止 shell 正确解释您的脚本。

Linux 命令行中的“错误解释器:没有这样的文件或目录”错误消息。

您甚至可以通过将file命令指向您的脚本来在 Linux 终端中确认问题。

 文件script1.sh 

在 Linux 中使用 file 命令检查文件的行尾。

如果文件使用 DOS 行结尾,您将在输出中看到“with CRLF line terminators”的消息。 如果我们的脚本一直使用正确的 Unix (LF) 换行符,它根本不会提到终止符。 幸运的是,重回 LF 业务很容易。

如何修复“Bad Interpreter: No Such File or Directory”错误

摆脱该错误消息并开始正常运行脚本所需要做的就是从 DOS 行尾切换到 Unix 行尾。 您可以使用终端命令或在您喜欢的代码编辑器中执行此操作。 以下是修复它的八种方法:

使用 dos2unix 命令

有一个命令行程序专门用于将 DOS(又名 Windows)文件转换为完全与 Unix 兼容的文件,恰当地命名为dos2unix 。 它在大多数默认存储库中可用,因此您可以在 Ubuntu 上安装它:

 sudo apt 安装 dos2unix

在我们的 Fedora 安装中预装了dos2unix ,但您可以通过以下方式确认您拥有它:

 sudo dnf 安装 dos2unix

在 Arch Linux 上:

 sudo pacman -S dos2unix

使用dos2unix很简单; 只需给它你的文件名。

 dos2unix script1.sh 

输入 dos2unix 命令。

如果您想在运行脚本之前确认转换成功,请使用file进行检查。 您还可以通过命名仅由一个空格分隔的多个文件来进行批量转换。

 dos2unix script1.sh script2.sh script3.sh

或者,如果您有一致的文件命名,您当然可以使用通配符编写更短的命令。

 dos2unix 脚本*.sh 

在 dos2unix 命令中使用星号以使用通配符进行转换。

dos2unix命令有几个标志可以帮助您进行特殊类型的转换,例如更改文件所有权。 如果您想切换回 CRLF,您甚至可以以相反的形式使用它unix2dos 。 输入dos2unix --help以了解更多信息。

使用 tr 命令

如果你不能或不想安装专用的实用程序,Linux 有内置的工具可以清理这些换行符。 使用tr命令,您可以去掉行尾的\r部分,这样我们就剩下\n终止符了。

 tr -d '\r' < script1.sh > script1_unix.sh

在这里, tr正在获取script1.sh文件的文本,删除它找到的每个\r实例,并将输出保存为文件script1_unix.sh

使用 sed 命令

shell 中内置的强大sed命令也可以更改文件的行尾。

 sed -i 's/\r//' script1.sh

如果您不熟悉sed语法,我们告诉sed编辑我们的文件 ( -i ) 并替换 ( s/ ) 每个回车 ( \r ) 为空。 这给我们留下了 Unix 首选的\n行终止符。

使用 vi 或 vim

如果您使用 vi 或 vim 编辑脚本,只需传递此命令即可将当前打开的文件转换为 Unix 行结尾。

 :set 文件格式=unix 

使用 vim 命令更改脚本文件格式。

相关:如何退出 Vi 或 Vim 编辑器

使用 Geany

如果您在桌面环境中工作,没有理由仅仅为了让您的文件为 Unix 世界做好准备而在终端上闲逛。 实际上,每个代码编辑器和 IDE 都有一个用于行尾的开关。 这包括 Geany。

要在 Geany 中转换行尾,请转到文档 > 设置行尾 > 转换并设置为 LF (Unix)。

在 Geany 中,在“文档”菜单下,转到“设置行尾”并选择“转换并设置为 LF (Unix)”。

保存您的脚本并尝试再次运行它。

使用 Kate 或 Kwrite

如果您使用 Kwrite 来编辑您的脚本,或者 Kwrite 的更强大的堂兄 Kate,您可以通过单击工具 > 行尾 > Unix 转换为 LF 格式。

在 Kwrite 中,在“工具”菜单中打开“行尾”并选择“Unix”。

保存文件并再次运行脚本。

使用记事本++

如果您在 Notepad++ 中编辑代码,您还可以轻松转换行尾,这很方便,因为您可能在 Windows 上运行它(除非您已经安装了适用于 Linux 的 Notepad++)并且可以在迁移到 Linux 系统之前转换它们。 打开文件后,转到“编辑”>“EOL 转换”>“Unix (LF)”。

请务必在运行之前保存您的脚本。

如果您希望 Notepad++ 默认创建带有 Unix 行尾的文件,请转到“设置”>“首选项”,选择“新建文档”选项卡,然后在“格式(行尾)”选项下单击“Unix (LF)”单选按钮。

使用 VS 代码

Visual Studio Code (VS Code) 的工作方式大致相同,只是切换更容易找到。 只需单击 VS Code 窗口右下角的“CRLF”。

您还可以通过转到“文件”>“首选项”>“设置”并在设置搜索栏中键入eol ,将 VS Code 设置为默认使用 Unix 行尾。 最上面的结果应该是一个用于设置“Eol”的下拉菜单。 将其更改为“\n”。

在 VS Code 设置中,将默认 EOL 设置更改为“\n”。

相关:如何让你的 Bash 脚本硬件感知