Không thể thực thi tệp .sh: / bin / bash ^ M: trình thông dịch xấu


107

Tôi muốn thực thi một kịch bản shell:

-rwxr-x--x 1 root root   17234 Jun  6 18:31 create_mgw_3shelf_6xIPNI1P.sh

Tôi đã cố gắng làm một thủ tục tiêu chuẩn, nhưng tôi đã gặp lỗi này:

./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0 
DEBUG   cd/etc/opt/ldapfiles/ldif_in ;
./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0
**ERROR  sh: ./create_mgw_3shelf_6xIPNI1P.sh: /bin/bash^M: bad interpreter: No such file or directory**

Nó có nghĩa là gì? Tôi đã làm điều này như là rootngười dùng trong rootnhóm.

Có nghĩa là tập tin không có quyền chính xác cho rootngười dùng?

Câu trả lời:


182

Đây không phải là vấn đề về quyền, bạn không nhận được thông báo về quyền

/bin/bash^M: bad interpreter: No such file or directory

Kịch bản chỉ ra rằng nó phải được thực thi bởi trình bao nằm ở /bin/bash^M. Không có tập tin nào như vậy: nó được gọi /bin/bash.

Đây ^Mlà một nhân vật trở về xe ngựa . Linux sử dụng ký tự nguồn cấp dữ liệu để đánh dấu sự kết thúc của một dòng, trong khi Windows sử dụng chuỗi hai ký tự CR LF. Tệp của bạn có kết thúc dòng Windows, gây nhầm lẫn cho Linux.

Loại bỏ các ký tự CR giả. Bạn có thể làm điều đó với lệnh sau:

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

22
Hoặc cài đặt và sử dụng dos2unixchương trình.
argentpepper

4
cảm ơn bạn vì điều này, tất cả các câu trả lời khác mà tôi tìm thấy cho đến nay vẫn chưa có ích. Điều này đã làm điều đó!
qodeninja

không phải là Windows, tôi đã nhận được một tin nhắn tương tự sau khi sao chép tập lệnh từ OS X sang Ubuntu ... dos2unix hoạt động rất tốt trong trường hợp đó, trong khi thay thế '\ r' bằng không có gì tệ hơn, vì không có '\ n 'ký tự trong tệp.
Michael

1
@Michael macOS sử dụng \nvì đó là Unix. Kịch bản có thể là từ một phiên bản Mac OS trước đó? Bạn có thể chạy sed -i -e 's/\r$/\n/' script.shtrong trường hợp đó.
wjandrea

1
Mở nó trong gedit và, thực hiện Save As và chọn "Kết thúc dòng: Unix / Linux"
Mattmon

23

Trong vim, bạn cũng có thể sử dụng :set ff=unixvà sau đó lưu tệp hoặc :set ff=dosđể lấy lại định dạng DOS.


cái này đã làm điều đó cho tôi, thx
bunkerdive

19

Tệp của bạn có các kết thúc dòng kiểu DOS / Windows (CR LF) , nhưng trên các hệ thống giống Unix chỉ có ký tự điều khiển LF được sử dụng làm ngắt dòng.

tự điều khiển CR bổ sung được hiển thị được mã hóa như ^Mtrong đầu ra của bạn. Bạn cũng có thể nhìn thấy nó khi bạn chạy cat -A create_mgw_3shelf_6xIPNI1P.sh.

Để chuyển đổi các kết thúc dòng từ kiểu DOS / Windows sang kiểu Unix, có một công cụ được gọi là dos2unix. Bạn cài đặt nó bằng cách sử dụng:

sudo apt-get install dos2unix

Sau đó, bạn có thể chỉ cần chuyển đổi kết thúc dòng của tệp theo cả hai cách bằng cách sử dụng

dos2unix FILENAME
unix2dos FILENAME

Trong trường hợp của bạn, chỉ cần chạy lệnh này bên dưới và tệp tập lệnh sẽ được chuyển đổi tại chỗ:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

Sau đó Bash sẽ có thể giải thích các tập tin chính xác.


1
Cảm ơn, dos2unix cũng có sẵn cho macOS thông qua brew.
Muhammad Annaqeeb

5

Vấn đề ist bạn chỉnh sửa với Dos!

mở tệp của bạn bằng vi rồi đặt unix với:

:set ff=unix
:wq

và tất cả đều ổn


4

Làm vi <your script>.

sau đó :set list; nó sẽ hiển thị bất kỳ ký tự đặc biệt nào trong tập lệnh của bạn.

sau đó thay thế ký tự:

:%s/^M//gc [để gõ ^Mnhấn Ctrl+ v+ m]


Xem câu trả lời ở trên về cách sử dụng: fileformat, IMHO tốt hơn để xử lý việc này hơn là thay thế toàn cầu Ngoài ra, hãy xem stackoverflow.com/questions/14609779/
Khăn

4

Như đã giải thích trong các câu trả lời khác, đây là một vấn đề định dạng. Vì vậy, câu trả lời là thay đổi định dạng từ kết thúc dòng kiểu DOS sang Unix. Đây là một cách đơn giản khác để sửa tệp của bạn 'tại chỗ'

fromdos file

Nó có sẵn trong gói tofrodos:

sudo apt-get install tofrodos

2

Bạn cũng có thể sử dụng gedit để loại bỏ các ký tự không mong muốn. Trong menu Tệp, chọn Lưu dưới dạng và đặt loại kết thúc dòng unix / Linux.


+1 cho điều này bởi vì nó đã giúp tôi với các kết thúc dòng MacOS.
Bobble
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.