Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

Bash 顯示「bad interpreter」?轉換腳本前先檢查 shebang 位元組

先分清 CRLF、解譯器路徑錯誤、執行環境缺失與存取失敗。

原創示意圖:顯示 Bash shebang 中的 CR 與 LF 位元組。
原創示意圖:變更腳本前保留首行位元組。 Watch at Ease

bad interpreter 是直接執行邊界的證據,不表示 Bash 本身損壞。Linux 會把可執行腳本首行解析為解譯器路徑;回車位元組、拼字錯誤、缺少執行環境或存取限制都可能使它失敗。

不要先跑 dos2unix、chmod、改 shebang 或以 bash script.sh 繞過。先保留錯誤與首行位元組,再區分 ENOENT 與 EACCES,只修正已證實的邊界。

凍結錯誤與首行位元組

記錄原命令與完整訊息,用 od -An -t x1 -N 64 script.sh 檢查首行:CRLF 是 0d 0a,LF 是 0a。

也記錄 file、ls -l 與檔案系統或容器情境;編輯或重新簽出會抹去重要證據。

解析核心真正看到的路徑

逐字讀取 #! 後的路徑,確認絕對路徑、拼字與執行環境。缺少斜線或把 usr 寫成 user 不是 CRLF。

若用 /usr/bin/env,確認 env 與目標程式在同一情境能解析,不要假設所有 PATH 與根檔案系統相同。

區分 ENOENT、EACCES 與繞過

No such file 可能指腳本或解譯器,也包含被 CR 汙染的名稱;存取錯誤則指向路徑搜尋、型別、執行位元或 noexec。

bash script.sh 成功只證明 Bash 能讀檔,不證明直接 shebang 正確。

套用最小修復

只有位元組證明 0d 0a 時才轉為 LF;路徑錯只改 shebang;解譯器不存在就安裝或選擇預期執行環境。

EACCES 要檢查執行位元、父目錄搜尋權限、檔案型別與掛載選項,不要一次混合多項修復。

預防復發並做退出測試

跨平台倉庫可審查 *.sh text eol=lf;在乾淨工作樹中檢查重新正規化差異。

回到原失敗情境直接執行並確認解譯器、首行位元組與簽出策略;錯誤類型若改變就分開診斷。

原創示意圖:區分 CRLF、錯誤路徑、缺失解譯器、存取拒絕與繞過。
原創示意圖:依證據選擇修復。 Watch at Ease