shebang hat cr-lf ile çalışmıyor


10

Neden aşağıdaki temel komut dosyalarının shebang bölümleri çalışmıyor:

$ cat hello.sh
#! /bin/sh
echo Hello
$ ./hello.sh
bash: ./hello.sh: /bin/sh^M: bad interpreter: No such file or directory

$ cat hello.py
#! /usr/bin/env python3
print("Hello")
$ ./hello.py
: No such file or directory

tercümanı elle çağırmak çalışırken:

$ sh hello.sh
Hello
$ python3 hello.py
Hello

Yanıtlar:


11

Komut dosyalarınız muhtemelen Unix tarzı LF satır sonlarına değil DOS tarzı CR-LF satır sonlarına sahiptir. İlk durumda hata mesajında ​​görülen ^ M, 0D karakterinin, komut satır yorumlayıcı adının bir parçası olarak yorumlandığını ve satır sonunun bir parçası olarak yorumlanmadığını gösterir (olması beklendiği gibi). Sisteminizde 0D (^ M) karakterini içeren bir yolu olan yürütülebilir bir dosya olmadığından, sistem yorumlayıcıyı çağıramaz. Tercümanınızı manuel olarak aradığınızda, komut dosyasında bulunan her iki satır sonunu da işleyebilir.

Komut dosyalarını Unix stili LF satır sonlarını kullanacak şekilde dönüştürürseniz, iş parçasının çalıştığını görmelisiniz. Bir örnek için okumaya devam edin.

Aşağıdaki oturumda, todos ve fromdos , satır sonu kurallarını CR- LF'den LF'ye dönüştürmek için bir yardımcı programdır (Ubuntu'da paket olarak mevcuttur tofrodos). Herhangi bir eşdeğer yardımcı program ( bu unix.SE sorusuna bakın ) gösteri amacıyla yapacaktır.

Aşağıdaki oturum konuşma metni (aynı komut dosyası dosyalarınızla yürütülür) durumu açıklığa kavuşturmalıdır:

$ fromdos hello.sh
$ ./hello.sh
Hello
$ todos hello.sh
$ ./hello.sh
bash: ./hello.sh: /bin/sh^M: bad interpreter: No such file or directory
$
$ fromdos hello.py
$ ./hello.py
Hello
$ todos hello.py
$ ./hello.py
: No such file or directory
$

O görünüyor bu kongre biten CR-LF hattının bir parçası olarak CR tanımıyor shebang satır okur çekirdek ve (en azından benim Kubuntu Şımarık sistemde sürümü itibariyle) görünüşte Linux çekirdeği olduğunu.

Senaryonuzun shebang çalışmıyor gibi görünüyorsa (örn. Script üzerinde tercümanı manuel olarak çağırmak işe yarıyorsa, ancak üzerinde yapmış olsanız bile script'i dosya adını kullanarak çalıştıramazsınız chmod +x), bu olası bir nedendir.

NOT: Yorum yapanlara da teşekkür ederiz. Daha iyi cevaplar olup olmadığını da duymaktan mutluluk duyarım!

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.