修復: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”。

您還可以將 VS Code 設置為默認使用 Unix 行尾,方法是轉到“文件”>“首選項”>“設置”並在設置搜索欄中鍵入eol 。 最上面的結果應該是一個用於設置“Eol”的下拉菜單。 將其更改為“\n”。

在 VS Code 設置中,將默認 EOL 設置更改為“\n”。

相關:如何讓你的 Bash 腳本硬件感知