發生 /bin/bash^M: bad interpreter: No such file or directory 怎麼解決

最近有一個學弟在 Windows 寫腳本直接複製到 Linux 上面跑發生了 /bin/bash^M: bad interpreter: No such file or directory 的錯誤,所以就來記錄一下解決方法與發生的原因。會發生

發生原因

可以觀察一下發生問題的腳本第一行,檔案被讀取後它第一步會去尋找 /bin/bash 但是這邊發生一個問題是它讀取到的卻是 /bin/bash^M,所以才會報錯。

而這個 ^M 其實是 dos 格式的換行字元,在 Windows 系統下檔案的換行字元是 \r\n 而 Linux 下的換行字元是 \n,因此造成了錯誤。

作業系統ASCII 轉義
Windows\r\nCRLF^M^J
Linux\nLF^J
  • CR:Carriage Return
  • LF:Linefeed
  • CRLF:Carriage Return & Linefeed
#!/bin/bash
echo "Hello World!"

解決方法

方法一

直接使用 sed 取代文字,假設檔案名稱是 script.sh

sed -i -e 's/\r$//' script.sh

方法二

可以使用 dos2unix 這個指令,假設檔案名稱是 script.sh

dos2unix script.sh

方法三

使用 Vim 開啟檔案直接取代它 :%s/^M//g,而在 Vim 底下要輸入 ^M 可不是直接輸入是使用鍵盤 ctrl+vctrl+m

方法四

使用 VS Code 的話可以點選右下角修改 CRLF 成 LF