co może spowodować, że skrypt nie znajdzie Pythona, gdy w pierwszym wierszu ma `#! / usr / bin / env python`?

19

Próbuję uruchomić casperjs na Ubuntu 12.04. Po instalacji po uruchomieniu dostaję:

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 jest więc obecny i działa, casperjs wskazuje właściwe miejsce i jest to skrypt Pythona. Ale kiedy go uruchamiam, pojawia się komunikat „Brak takiego pliku”.

Mogę to naprawić, zmieniając pierwszą linię pliku python casperjs z:

#!/usr/bin/env python

do:

#!/usr/bin/python

Wynik:

$ casperjs --version
1.1.0-DEV

Udało mi się to naprawić, ale zastanawiam się, dlaczego to nie działało #!/usr/bin/env python, ponieważ wydaje się to normalną linią tłumacza. Czy mam coś źle skonfigurowanego?

Oto kroki, aby uzyskać casperjs:

$ 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
jcollum
źródło
Czy możesz spróbować uruchomić strace /usr/local/bin/casperjswersję niedziałającą? Byłoby pomocne, gdybyśmy mogli zobaczyć, które pliki env próbuje wykonać i czy env nie może znaleźć Pythona, czy python nie otwiera skryptu.
Mark Plotnick,
@MarkPlotnick uruchomił to, 100s linii wyjściowych, coś konkretnego?
jcollum,
Wszelkie linie emitowane tuż przed : No such file or directorywyjściem, które zawierają próbę wykonania. [edytuj: właśnie zobaczyłem odpowiedź Gillesa. Sprawdź, czy linie na wyjściu strace wyglądają tak execve("/usr/bin/python\r", ...). ]
Mark Plotnick,

Odpowiedzi:

36

Jeśli zobaczysz błąd „: Brak takiego pliku lub katalogu” (bez żadnych znaków przed dwukropkiem), oznacza to, że linia shebang ma na końcu znak powrotu karetki, prawdopodobnie dlatego, że był edytowany w systemie Windows (który używa CR, LF jako separator linii). Znak CR powoduje, że kursor przesuwa się z powrotem na początek wiersza po tym, jak powłoka wypisuje początek komunikatu, dzięki czemu można zobaczyć tylko część po CR, która kończy ciąg interpretera, który jest częścią komunikatu o błędzie.

Usuń CR: linia shebang musi mieć końcówkę linii uniksowej (tylko wysuw linii ). Sam Python dopuszcza zakończenia linii CRLF, więc znaki CR w innych liniach nie boli. Z drugiej strony skrypty powłoki muszą być wolne od znaków CR.

Aby usunąć zakończenia linii Windows, możesz użyć dos2unix :

sudo dos2unix /usr/local/bin/casperjs

lub sed:

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

Jeśli musisz edytować skrypty w systemie Windows, użyj edytora, który radzi sobie z końcówkami linii uniksowych (tj. Czymś mniej mózgowym niż Notepad) i upewnij się, że jest skonfigurowany do zapisywania końcówek linii uniksowych (tj. Tylko LF) podczas edycji pliku uniksowego.

Gilles „SO- przestań być zły”
źródło
Natknąłem się na ten problem, ale zawsze ma ^Mna końcu. Jestem tutaj wyłącznie w Ubuntu, ale wciąż gedit czasami dodaje ^ M, więc poszedłem do Geany. W każdym razie spowoduje to inny błąd i nie jest to błąd, który widzę.
jcollum,
1
@jcollum ^Minny sposób na powiedzenie CR.
Gilles 'SO - przestań być zły'
Tak, rozumiem to, ale mówię, że nie otrzymuję już tego błędu, więc nie jest to problem z łamaniem linii.
jcollum
@jcollum Usunąłeś CR podczas edycji linii shebang. Jeśli zmienisz go z powrotem na #!/usr/bin/env python(bez dodawania CR), będzie działać.
Gilles 'SO - przestań być zły'
2
Uwaga dla każdego, kto nie ma pojęcia o terminologii: CR = \r= Unicode U + 0D = ^ M (Ctrl + M), a LF = \n= Unicode U + A0 = ^ J (Ctrl + J)
wjandrea
0

Używam Visual Studio Code i jestem nowy w edytorze tekstu. Otrzymałem ten sam błąd i próbowałem ręcznie wykonać kroki opisane w tym poście, nie działało to dla mnie. Jednak w Visual Studio Code prawy dolny róg zapewnia opcję przełączania między CR i LF w locie, problem rozwiązany. Nie jestem pewien, czy to dotyczy, ale jeśli programujesz w edytorze tekstu, może on dostarczyć prostą odpowiedź, podając przycisk przełączania.

Gerald
źródło