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.