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

简介: 如果在运行 shell 脚本时出现“错误的解释器:没有这样的文件或目录”错误,则需要将脚本文件从 Windows 行尾转换为 Unix 行尾。一种方法是使用 dos2unix
命令,如下所示:
dos2unix script1.sh
您是否尝试运行 Bash 脚本并收到“/bin/bash^M:错误的解释器:没有这样的文件或目录”的错误消息?输出不是很有帮助,几乎给人的印象是您的脚本丢失了。幸运的是,情况并非如此,修复非常简单。
什么是“糟糕的解释器:没有这样的文件或目录”错误?
收到一条错误消息,内容为 /bin/bash^M: bad interpreter: No such file or directory
仅表示您的 shell 脚本文件的行尾错误 - 位于行尾的字符表示是时候移到下一行了。 DOS 后裔 Windows 喜欢看到“回车和换行”(CRLF) 终止符,标记为 \r\n
。相比之下,Linux、现代 macOS 和其他基于 Unix 的系统仅使用“换行”(LF) 或 \n
。
如果您看到这个错误的解释器错误,很可能是您或您的脚本最初是在 Windows 计算机上编写的。 Bash 看到 Windows 计算机设置的那些 \r\n
行结尾并感到不安,因为它们阻止 shell 正确解释您的脚本。

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

如果文件使用 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 install dos2unix
在我们的 Fedora 安装中,dos2unix
是预装的,但您可以通过以下方式确认您拥有它:
sudo dnf install dos2unix
在 Arch Linux 上:
sudo pacman -S dos2unix
使用 dos2unix
很简单;只需给它你的文件名。
dos2unix script1.sh

如果您想在运行脚本之前确认转换成功,请使用 file
检查它。您还可以通过命名仅由一个空格分隔的多个文件来进行批量转换。
dos2unix script1.sh script2.sh script3.sh
或者,如果您有一致的文件命名,您当然可以使用通配符编写更短的命令。
dos2unix script*.sh

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 fileformat=unix

使用 Geany
如果你在桌面环境中工作,没有理由为了让你的文件为 Unix 世界做好准备而在终端上闲逛。实际上,每个代码编辑器和 IDE 都有一个用于行尾的开关。这包括 Geany。
要在 Geany 中转换行尾,请转到文档 > 设置行尾 > 转换并设置为 LF (Unix)。

保存您的脚本并尝试再次运行它。
使用 Kate 或 Kwrite
如果您使用 Kwrite 来编辑您的脚本,或者 Kwrite 的更强大的表亲 Kate,您可以通过单击工具 > 行尾 > Unix 转换为 LF 格式。

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

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

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

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