Khắc phục: Lỗi “Bad Interpreter: No Such File or Directory” trong Linux

Tác giả sysadmin, T.Tư 18, 2023, 09:10:31 SÁNG

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 3 Khách đang xem chủ đề.

Khắc phục: Lỗi "Bad Interpreter: No Such File or Directory" trong Linux


Nếu bạn gặp lỗi "Bad Interpreter: No Such File or Directory" khi chạy tập lệnh shell, bạn cần chuyển đổi tệp tập lệnh của mình từ Windows sang phần cuối dòng Unix. Một phương pháp là sử dụng dos2unixlệnh, như sau:

Mã nguồn [Chọn]
dos2unix script1.sh

Bạn đã thử chạy tập lệnh Bash và nhận được thông báo lỗi "/bin/bash^M: Bad Interpreter: No Such File or Directory"? Đầu ra không hữu ích lắm và gần như tạo ấn tượng rằng tập lệnh của bạn bị thiếu. May mắn thay, không phải như vậy và cách khắc phục rất đơn giản.

1. Lỗi "Bad Interpreter: No Such File or Directory" là gì?

Nhận được thông báo lỗi  /bin/bash^M: bad interpreter: No such file or directory chỉ đọc có nghĩa là tệp tập lệnh shell của bạn có phần cuối dòng không đúng —các ký tự được đặt ở cuối dòng cho biết đã đến lúc chuyển sang dòng tiếp theo. Windows có hệ điều hành DOS  thích nhìn thấy dấu kết thúc "carriage return and line feed" (CRLF), được ký hiệu là \r\n. Ngược lại, Linux, macOS hiện đại và các hệ thống dựa trên Unix khác chỉ sử dụng "nguồn cấp dữ liệu" (LF) hoặc  \n.

Nếu bạn thấy lỗi thông dịch viên không hợp lệ này, rất có thể bạn hoặc người mà bạn nhận được tập lệnh ban đầu đã viết tập lệnh đó trên máy tính Windows. Bash nhìn thấy \r\n các kết thúc dòng đó do máy tính Windows đặt và khó chịu vì chúng ngăn trình bao diễn giải chính xác tập lệnh của bạn.


Bạn thậm chí có thể xác nhận sự cố trong thiết bị đầu cuối Linux bằng cách trỏ lệnh file tới tập lệnh của mình.

Mã nguồn [Chọn]
file script1.sh

Nếu tệp sử dụng kết thúc dòng DOS, bạn sẽ thấy thông báo "có dấu kết thúc dòng CRLF" được thêm vào đầu ra. Nếu tập lệnh của chúng tôi đang sử dụng các dòng mới Unix (LF) thích hợp, nó sẽ không đề cập đến các trình kết thúc. May mắn thay, quay trở lại kinh doanh LF thật dễ dàng.

2. Cách khắc phục lỗi "Bad Interpreter: No Such File or Directory"

Tất cả những gì cần thiết để loại bỏ thông báo lỗi đó và bắt đầu chạy tập lệnh của bạn như bình thường là chuyển từ kết thúc dòng DOS sang kết thúc dòng Unix. Bạn có thể thực hiện việc này bằng các lệnh đầu cuối hoặc trong trình chỉnh sửa mã yêu thích của mình. Sau đây là tám cách khắc phục:

2.1. Sử dụng lệnh dos2unix

Có một chương trình dòng lệnh được tạo chỉ để chuyển đổi các tệp DOS (hay còn gọi là Windows) thành các tệp hoàn toàn tương thích với Unix có tên thích hợp là dos2unix. Nó có sẵn trong hầu hết các kho lưu trữ mặc định, vì vậy bạn có thể cài đặt nó trên Ubuntu bằng:

Mã nguồn [Chọn]
sudo apt install dos2unix
Trên bản cài đặt  Fedorados2unix của chúng tôi đã được cài đặt sẵn, nhưng bạn có thể xác nhận rằng bạn có nó bằng:

Mã nguồn [Chọn]
sudo dnf install dos2unix
Trên Arch Linux:

Mã nguồn [Chọn]
sudo pacman -S dos2unix
Sử dụng dos2unix rất đơn giản; chỉ cần cung cấp cho nó tên tập tin của bạn.

Mã nguồn [Chọn]
dos2unix script1.sh

Kiểm tra nó nếu bạn muốn xác nhận chuyển đổi thành công trước khi chạy tập lệnh của mình. Bạn cũng có thể chuyển đổi hàng loạt bằng cách đặt tên cho nhiều tệp chỉ cách nhau một khoảng trắng.

Mã nguồn [Chọn]
dos2unix script1.sh script2.sh script3.sh
Hoặc, nếu bạn đặt tên tệp nhất quán, tất nhiên bạn có thể viết các lệnh ngắn hơn bằng ký tự đại diện.

Mã nguồn [Chọn]
dos2unix script*.sh

Lệnh này dos2unix có một số cờ để giúp bạn thực hiện các loại chuyển đổi đặc biệt, chẳng hạn như thay đổi quyền sở hữu tệp. Bạn thậm chí có thể sử dụng nó ở dạng đảo ngược, unix2dos, nếu bạn muốn chuyển về CRLF. Nhập dos2unix --help để tìm hiểu thêm.

2.2. Sử dụng lệnh tr

Nếu bạn không thể hoặc không muốn cài đặt một tiện ích chuyên dụng, Linux có sẵn các công cụ sẽ dọn sạch những dòng mới đó. Với trlệnh này, bạn có thể loại bỏ  \r phần kết thúc dòng để chúng ta còn lại \ncác dấu kết thúc.

Mã nguồn [Chọn]
tr -d '\r' < script1.sh > script1_unix.sh
Ở đây, tr lấy văn bản của tập tin   Đăng nhập để xem liên kết, xóa mọi phiên bản của \r nó tìm thấy và lưu đầu ra dưới dạng tệp script1_unix.sh.

2.3. Sử dụng lệnh sed

sedLệnh hùng mạnh  được tích hợp trong trình bao của bạn cũng có thể thay đổi kết thúc dòng cho tệp của bạn.

Mã nguồn [Chọn]
sed -i 's/\r//' script1.sh
Nếu bạn không quen thuộc với sedcú pháp, chúng tôi khuyên sedbạn nên chỉnh sửa tệp ( -i) và thay thế ( s/) mỗi dấu xuống dòng ( \r) bằng không. Điều đó để lại cho chúng tôi \ncác bộ kết thúc dòng ưa thích của Unix.

2.4. Sử dụng vi hoặc vim

Nếu bạn sử dụng vi hoặc vim để chỉnh sửa tập lệnh của mình, chỉ cần chuyển lệnh này để chuyển đổi tệp hiện đang mở sang phần cuối dòng Unix.

Mã nguồn [Chọn]
:set fileformat=unix

2.5. Sử dụng Geany

Nếu bạn đang làm việc trong môi trường máy tính để bàn, không có lý do gì phải loay hoay trong thiết bị đầu cuối chỉ để làm cho các tệp của bạn sẵn sàng cho thế giới Unix. Hầu như mọi trình soạn thảo mã và IDE ngoài kia đều có nút chuyển đổi cho kết thúc dòng. Điều đó bao gồm Geany.

Để chuyển đổi kết thúc dòng trong Geany, hãy đi tới Tài liệu > Đặt kết thúc dòng > Chuyển đổi và đặt thành LF (Unix).


Lưu tập lệnh của bạn và thử chạy lại.

2.6. Sử dụng Kate hoặc Kwrite

Nếu bạn sử dụng Kwrite để chỉnh sửa tập lệnh của mình hoặc Kate, người anh em mạnh mẽ hơn của Kwrite, bạn có thể chuyển đổi sang định dạng LF bằng cách nhấp vào Công cụ > Cuối dòng > Unix.


Lưu tệp và chạy lại tập lệnh của bạn.

2.7. Sử dụng Notepad++

Nếu bạn chỉnh sửa mã trong Notepad++, bạn cũng có thể dễ dàng chuyển đổi phần cuối dòng, điều này rất tiện lợi vì bạn có thể đang chạy mã đó trên Windows (trừ khi bạn đã cài đặt Notepad++ cho Linux ) và có thể chuyển đổi chúng trước khi chuyển sang hệ thống Linux của mình. Với tệp đang mở, hãy chuyển đến Chỉnh sửa > Chuyển đổi EOL > Unix (LF).


Đảm bảo lưu tập lệnh của bạn trước khi chạy.

Nếu bạn muốn Notepad++ tạo các tệp có kết thúc dòng Unix theo mặc định, hãy đi tới Cài đặt > Tùy chọn, chọn tab "Tài liệu mới" và bên dưới tùy chọn "Định dạng (kết thúc dòng)", hãy nhấp vào nút radio "Unix (LF)".


2.8. Sử dụng mã VS

Visual Studio Code (VS Code) hoạt động theo cách tương tự, chỉ có nút chuyển đổi là dễ tìm hơn. Chỉ cần nhấp vào "CRLF" ở góc dưới cùng bên phải của cửa sổ VS Code.


Bạn cũng có thể đặt Mã VS để sử dụng kết thúc dòng Unix theo mặc định bằng cách đi tới Tệp > Tùy chọn > Cài đặt và nhập  eol vào thanh tìm kiếm cài đặt. Kết quả hàng đầu phải là một trình đơn thả xuống để cài đặt "Eol". Thay đổi nó thành "\ n".


Trong cài đặt Mã VS, thay đổi cài đặt EOL mặc định thành "\n".