Bir .sh dosyasını çalıştıramıyor: / bin / bash ^ M: hatalı yorumlayıcı


107

Bir kabuk betiği çalıştırmak istedim:

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

Standart bir prosedür yapmaya çalıştım, ancak şu hatayı aldım:

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

Bunun anlamı ne? Bunu grubun rootaltındaki kullanıcı olarak yapıyordum root.

Dosyanın rootkullanıcı için doğru izne sahip olmadığı anlamına mı geliyor ?

Yanıtlar:


182

Bu bir izin sorunu değil, izinlerle ilgili bir mesaj alamıyorsunuz.

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

Komut, bulunduğu bir kabuk tarafından yürütülmesi gerektiğini belirtir /bin/bash^M. Böyle bir dosya yok: denir /bin/bash.

^MBir olan satırbaşı karakteri . Linux, satır sonunu işaretlemek için satır besleme karakterini kullanırken, Windows iki karakterli dizisi CR LF'yi kullanır. Dosyanızda Linux ile karıştırılan Windows satır sonları var.

Sahte CR karakterlerini kaldırın. Aşağıdaki komutla yapabilirsiniz:

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

22
Veya dos2unixprogramı kurun ve kullanın .
— argentpepper

4
Bunun için teşekkür ederim, şu ana kadar bulduğum diğer cevapların hiçbiri yardımcı olmadı. Bu bir yaptı!
— qodeninja

Windows olmak zorunda değil, OS X’ten Ubuntu’ya bir betiği kopyaladıktan sonra benzer bir mesaj aldım ... dos2unix bu durumda harika çalıştı, oysa '' r 'yi hiçbir şey ile değiştirmek daha kötü olurdu, çünkü' n 'dosyadaki karakterler.
— Michael

1
@Michael macOS kullandığı \niçin Unix. Komut dosyası belki daha eski bir Mac OS sürümündendi? Bu sed -i -e 's/\r$/\n/' script.shdurumda kaçabilirsin.
— wjandrea

1
Gedit'te aç ve Farklı Kaydet'i yap ve "Line Ending: Unix / Linux"
— u seç

23

Vim'de ayrıca :set ff=unix, dosyayı kullanabilir ve daha sonra :set ff=dosDOS formatını tekrar almak için de kullanabilirsiniz .


bu benim için yaptı, thx
— bunkerdive

19

Dosyanız DOS / Windows stil satır sonlarına (CR LF) sahiptir , ancak Unix benzeri sistemlerde yalnızca LF kontrol karakteri satır sonu olarak kullanılır.

Ek CR kontrol karakteri^M çıktınızdaki gibi kodlanmış olarak gösterilir . Koşarken onu da görebilirsin cat -A create_mgw_3shelf_6xIPNI1P.sh.

Satır sonlarını DOS / Windows stilinden Unix stiline dönüştürmek için adlı bir araç vardır dos2unix. Kullanarak yüklersiniz:

sudo apt-get install dos2unix

Ardından, dosyaların satır sonlarını kullanarak her iki yönde de dönüştürebilirsiniz.

dos2unix FILENAME
unix2dos FILENAME

Sizin durumunuzda, sadece aşağıdaki komutu çalıştırın ve komut dosyası yerinde dönüştürülecektir:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

Bundan sonra Bash dosyayı doğru yorumlayabilmelidir.


1
Teşekkürler, dos2unix ayrıca demleme yoluyla macOS için de kullanılabilir.
— Muhammad Annaqeeb 18:18

5

Sorun Dos ile düzenlediğiniz ist!

Dosyanızı vi ile açın ve sonra unix ile ayarlayın:

:set ff=unix
:wq

ve hepsi iyi


4

Do vi <your script>.

sonra :set list; betiğinizdeki özel karakterlerden herhangi birini görüntüler.

sonra karakteri değiştirin:

:%s/^M//gc [ + + ^Mtuşuna basın ]Ctrlvm


Bkz Ayrıca küresel ikamesi daha bu işleme için IMHO iyidir FileFormat: kullanmayla ilgili cevap Yukarıya bakın stackoverflow.com/questions/14609779/... otomatik nasıl ele alınacağı üzerinde fikirler için
— qneill

4

Diğer cevaplarda açıklandığı gibi, bu bir format sorunudur. Bu nedenle yanıt, biçimi DOS'tan Unix stil satır sonlarına dönüştürmektir. Bu, dosyanızı 'yerinde' düzeltmenin basit bir yoludur

fromdos file

Pakette mevcut tofrodos:

sudo apt-get install tofrodos

2

İstenmeyen karakterleri kaldırmak için gedit kullanabilirsiniz. Dosya menüsü altında Farklı Kaydet'i seçin ve satır sonunu unix / Linux olarak ayarlayın.


Bunun için +1, MacOS satır sonlarında bana yardımcı oldu.
— Bobble,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.