修复:Linux 中的“Bad Interpreter: No Such File or Directory”错误
已发表: 2023-05-01dos2unix
命令,如下所示: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 正确解释您的脚本。
您甚至可以通过将file
命令指向您的脚本来在 Linux 终端中确认问题。
文件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 安装 dos2unix
在我们的 Fedora 安装中预装了dos2unix
,但您可以通过以下方式确认您拥有它:
sudo dnf 安装 dos2unix
在 Arch Linux 上:
sudo pacman -S dos2unix
使用dos2unix
很简单; 只需给它你的文件名。
dos2unix script1.sh
如果您想在运行脚本之前确认转换成功,请使用file
进行检查。 您还可以通过命名仅由一个空格分隔的多个文件来进行批量转换。
dos2unix script1.sh script2.sh script3.sh
或者,如果您有一致的文件命名,您当然可以使用通配符编写更短的命令。
dos2unix 脚本*.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 文件格式=unix
相关:如何退出 Vi 或 Vim 编辑器
使用 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”。
您还可以通过转到“文件”>“首选项”>“设置”并在设置搜索栏中键入eol
,将 VS Code 设置为默认使用 Unix 行尾。 最上面的结果应该是一个用于设置“Eol”的下拉菜单。 将其更改为“\n”。
相关:如何让你的 Bash 脚本硬件感知