修復:Linux 中的“Bad Interpreter: No Such File or Directory”錯誤
已發表: 2023-05-01
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 正確解釋您的腳本。
您甚至可以通過將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”。
您還可以將 VS Code 設置為默認使用 Unix 行尾,方法是轉到“文件”>“首選項”>“設置”並在設置搜索欄中鍵入eol
。 最上面的結果應該是一個用於設置“Eol”的下拉菜單。 將其更改為“\n”。
相關:如何讓你的 Bash 腳本硬件感知