最近有一個學弟在 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\n | CRLF | ^M^J |
Linux | \n | LF | ^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+v 與 ctrl+m
方法四
使用 VS Code 的話可以點選右下角修改 CRLF 成 LF
《AWS CDK 完全學習手冊:打造雲端基礎架構程式碼 IaC》
第 12 屆 iT 邦幫忙鐵人賽 DevOps 組冠的《用 CDK 定 義 AWS 架構》
第 11 屆 iT 邦幫忙鐵人賽《LINE bot 好好玩 30 天玩轉 LINE API》
一個熱愛分享的雲端工程師!