bir komut dosyasının ilk satırda "#! / usr / bin / env python` olduğunda python bulamamasına ne neden olabilir?


19

Ubuntu 12.04'te casperjs'i çalıştırmaya çalışıyorum. Ben çalıştırdıktan sonra yükledikten sonra ben olsun:

09:20 $ ll /usr/local/bin/casperjs
lrwxrwxrwx 1 root root 26 Nov  6 16:49 /usr/local/bin/casperjs -> /opt/casperjs/bin/casperjs

09:20 $ /usr/bin/env python --version
Python 2.7.3

09:20 $ cat /opt/casperjs/bin/casperjs | head -4 
#!/usr/bin/env python

import os
import sys

09:20 $ casperjs
: No such file or directory

09: 22 $ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2

Python var ve çalıştırılabilir, casperjs doğru yere işaret ediyor ve bir python betiği. Ama çalıştırdığımda "Böyle bir dosya yok".

Casperjs python dosyasının ilk satırını değiştirerek düzeltebilirim:

#!/usr/bin/env python

için:

#!/usr/bin/python

Sonuç:

$ casperjs --version
1.1.0-DEV

Düzeltmeyi başardım, ama neden işe yaramadığını merak ediyorum #!/usr/bin/env python, çünkü bu normal bir tercüman hattı gibi görünüyor. Yanlış yapılandırılmış bir şeyim var mı?

İşte casperjs almak için adımlar:

$ git clone git://github.com/n1k0/casperjs.git
$ cd casperjs
$ ln -sf `pwd`/bin/casperjs /usr/local/bin/casperjs
$ casperjs
: No such file or directory

strace /usr/local/bin/casperjsÇalışmayan sürümde çalışmayı deneyebilir misiniz ? Env'in hangi dosyaları yürütmeye çalıştığını ve env'nin python veya python'u bulamamasının komut dosyasını açıp açmadığını görebilirsek yararlı olur.
Mark Plotnick

@ MarkPlotnick koştu, 100s çıkış hatları, özellikle bir şey?
jcollum

: No such file or directoryÇıktı yapılmadan hemen önce yayınlanan satırlar yürütme denemelerini içerir. [değiştir: Gilles'in cevabını gördüm. Şerit çıktısında benzeyen çizgiler olup olmadığını kontrol edin execve("/usr/bin/python\r", ...). ]
Mark Plotnick

Yanıtlar:


36

“: Böyle bir dosya veya dizin yok” hatasını görüyorsanız (iki nokta üst üste işaretinden önce hiçbir şey yok), muhtemelen Windows altında düzenlendiği için (çünkü CR, LF kullanan satır ayırıcı). CR karakteri, kabuk iletinin başlangıcını yazdırdıktan sonra imlecin satırın başına gitmesine neden olur ve böylece CR'den sonra yalnızca hata iletisinin bir parçası olan yorumlayıcı dizesini sonlandıran bölümü görürsünüz.

CR'yi çıkarın: shebang hattının bir Unix satırının bitmesi gerekir (yalnızca satır besleme). Python'un kendisi CRLF satır sonlarına izin verir, bu nedenle diğer satırlardaki CR karakterleri zarar vermez. Diğer taraftan, kabuk betimlerinde CR karakterleri bulunmamalıdır.

Windows satır sonlarını kaldırmak için dos2unix komutunu kullanabilirsiniz :

sudo dos2unix /usr/local/bin/casperjs

veya sed:

sudo sed -i -e 's/\r$//' /usr/local/bin/casperjs

Windows altında komut dosyalarını düzenlemeniz gerekiyorsa, Unix satır sonlarıyla başa çıkabilen bir düzenleyici kullanın (yani Not Defteri'nden daha az beyin ölmüş bir şey) ve bir Unix dosyasını düzenlerken Unix satır sonları (yalnızca LF) yazacak şekilde yapılandırıldığından emin olun.


Bu sorunla karşılaştım ama her zaman ^Msonunda bir var. Ben sadece burada Ubuntu'dayım ama yine de gedit ^ M'yi bazen koyar, bu yüzden Geany'ye gittim. Her neyse, farklı bir hata verecektir ve bu gördüğüm hata değil.
jcollum

1
@jcollum ^MCR demenin başka bir yolu.
Gilles 'SO- kötü olmayı bırak'

Evet bunu anlıyorum ama söylediklerim artık bu hatayı almıyorum, bu yüzden satır sonu sorunu değil.
jcollum

@jcollum Mesele hattını düzenlediğinizde CR'yi kaldırdınız. Tekrar #!/usr/bin/env python(bir CR eklemeden) olarak değiştirirseniz, çalışır.
Gilles 'SO- kötü olmayı bırak'

2
Terminoloji hakkında şaşkın olan herkes için not: CR = \r= Unicode U + 0D = ^ M (Ctrl + M) ve LF = \n= Unicode U + A0 = ^ J (Ctrl + J)
wjandrea

0

Visual Studio Code kullanıyorum ve metin düzenleyicide yeniyim. Aynı hatayı alıyordum ve bu yazıdaki adımları izleyerek manuel olarak denedim, benim için çalışmadı. Ancak, Visual Studio Code sağ alt köşesinde anında CR ve LF arasında geçiş yapma seçeneği sunar, sorun çözüldü. Bunun geçerli olup olmadığından emin değilim ancak bir metin düzenleyicide programlıyorsanız, geçiş yapmak için bir düğme sağlayarak basit bir cevap sağlayabilir.

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.