Tidak dapat mengeksekusi file .sh: / bin / bash ^ M: interpreter buruk

107

Saya ingin menjalankan skrip shell:

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

Saya mencoba melakukan prosedur standar, tetapi saya mendapatkan kesalahan ini:

./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**

Apa artinya? Saya melakukan ini sebagai rootpengguna di bawah rootgrup.

Apakah ini berarti file tersebut tidak memiliki izin yang benar untuk rootpengguna?

pengguna165062
sumber

Jawaban:

182

Ini bukan masalah izin, Anda tidak mendapatkan pesan tentang izin

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

Script menunjukkan bahwa itu harus dijalankan oleh shell yang terletak di /bin/bash^M. Tidak ada file seperti itu: namanya /bin/bash.

Ini ^Madalah karakter carriage return . Linux menggunakan karakter umpan baris untuk menandai akhir dari sebuah baris, sedangkan Windows menggunakan urutan dua karakter CR LF. File Anda memiliki ujung garis Windows, yang membingungkan Linux.

Hapus karakter CR palsu. Anda dapat melakukannya dengan perintah berikut:

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh
Gilles
sumber
22
Atau instal dan gunakan dos2unixprogram.
argentpepper
4
terima kasih untuk ini, semua jawaban lain yang saya temukan sejauh ini tidak membantu. Yang ini berhasil!
qodeninja
tidak harus Windows, saya mendapat pesan serupa setelah menyalin skrip dari OS X ke Ubuntu ... dos2unix bekerja sangat baik dalam kasus itu, sedangkan mengganti '\ r' dengan tidak ada yang lebih buruk, karena tidak ada '\ n 'karakter dalam file.
Michael
1
@Michael macOS menggunakan \nkarena itu Unix. Script itu mungkin dari versi Mac OS sebelumnya? Anda bisa lari sed -i -e 's/\r$/\n/' script.shdalam kasus itu.
wjandrea
1
Buka di gedit dan, lakukan Save As, dan pilih "Line Ending: Unix / Linux"
Mattmon
23

Dalam vim Anda juga bisa menggunakan :set ff=unixdan kemudian menyimpan file, atau :set ff=dosuntuk mendapatkan format DOS lagi.

ortang
sumber
yang ini melakukannya untuk saya, thx
bunkerdive
19

File Anda memiliki ujung garis gaya DOS / Windows (CR LF) , tetapi pada sistem seperti Unix hanya karakter kontrol LF yang digunakan sebagai pemecah baris.

Karakter kontrol CR tambahan ditampilkan disandikan seperti ^Mdalam output Anda. Anda juga dapat melihatnya saat Anda menjalankan cat -A create_mgw_3shelf_6xIPNI1P.sh.

Untuk mengubah ujung garis dari gaya DOS / Windows ke gaya Unix, ada alat yang disebut dos2unix. Anda menginstalnya menggunakan:

sudo apt-get install dos2unix

Kemudian Anda cukup mengonversi akhiran baris file dengan kedua cara menggunakan

dos2unix FILENAME
unix2dos FILENAME

Dalam kasus Anda, jalankan perintah ini di bawah dan file skrip akan dikonversi di tempat:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

Setelah itu Bash harus dapat menafsirkan file dengan benar.

Komandan Byte
sumber
1
Terima kasih, dos2unix juga tersedia untuk macOS via minuman.
Muhammad Annaqeeb
5

Masalahnya Anda edit dengan Dos!

buka file Anda dengan vi lalu setel unix dengan:

:set ff=unix
:wq

dan semuanya baik-baik saja

DaFreder
sumber
4

Lakukan vi <your script>.

lalu :set list; itu akan menampilkan salah satu karakter khusus dalam skrip Anda.

lalu ganti karakter:

:%s/^M//gc [untuk mengetik, ^Mtekan Ctrl+ v+ m]

Pankaj Sain
sumber
Lihat jawaban di atas tentang menggunakan: fileformat yang IMHO lebih baik untuk menangani ini daripada substitusi global Juga, lihat stackoverflow.com/questions/14609779/... untuk ide tentang cara menangani secara otomatis
qneill
4

Seperti yang dijelaskan dalam jawaban lain, ini adalah masalah format. Jadi, jawabannya adalah mengubah format dari akhir baris gaya DOS ke Unix. Ini adalah cara sederhana lain untuk memperbaiki file Anda 'di tempat'

fromdos file

Ini tersedia dalam paket tofrodos:

sudo apt-get install tofrodos
josediazaz
sumber
2

Anda juga dapat menggunakan gedit untuk menghapus karakter yang tidak diinginkan. Di bawah menu File, pilih Save As dan atur tipe end line unix / Linux.

ilmu agama
sumber
+1 untuk ini karena membantu saya dengan akhiran garis MacOS.
Bobble