qu'est-ce qui pourrait empêcher un script de trouver python quand il a `#! / usr / bin / env python` dans la première ligne?

19

Essayer de faire fonctionner casperjs sur Ubuntu 12.04. Après l'avoir installé lorsque je cours, j'obtiens:

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

Donc Python est présent et exécutable, casperjs pointe vers le bon endroit et c'est un script python. Mais lorsque je l'exécute, j'obtiens "Aucun fichier de ce type".

Je peux le corriger en changeant la première ligne du fichier python casperjs de:

#!/usr/bin/env python

à:

#!/usr/bin/python

Résultat:

$ casperjs --version
1.1.0-DEV

J'ai réussi à le réparer, mais je me demande pourquoi cela n'a pas fonctionné #!/usr/bin/env python, car cela semble être une ligne d'interprétation normale. Ai-je quelque chose de mal configuré?

Voici les étapes pour obtenir des 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
la source
Pouvez-vous essayer de fonctionner strace /usr/local/bin/casperjssur la version non fonctionnelle? Serait utile si nous pouvions voir quels fichiers env tente d'exécuter, et si env ne parvient pas à trouver python ou python ne parvient pas à ouvrir le script.
Mark Plotnick
@MarkPlotnick a couru ça, 100s de lignes de sortie, quelque chose en particulier?
jcollum
Toutes les lignes émises juste avant la : No such file or directorysortie qui contiennent des tentatives d'exécution. [edit: viens de voir la réponse de Gilles. Recherchez les lignes dans la sortie strace qui ressemblent execve("/usr/bin/python\r", ...). ]
Mark Plotnick

Réponses:

36

Si vous voyez l'erreur ": aucun fichier ou répertoire" (sans rien avant les deux-points), cela signifie que votre ligne shebang a un retour chariot à la fin, probablement parce qu'il a été édité sous Windows (qui utilise CR, LF comme séparateur de ligne). Le caractère CR fait revenir le curseur au début de la ligne après que le shell imprime le début du message et donc vous ne voyez que la partie après CR qui termine la chaîne d'interprétation qui fait partie du message d'erreur.

Supprimez le CR: la ligne shebang doit avoir une fin de ligne Unix (saut de ligne uniquement). Python lui-même autorise les fins de ligne CRLF, donc les caractères CR sur les autres lignes ne font pas de mal. Les scripts shell d'autre part doivent être exempts de caractères CR.

Pour supprimer les fins de ligne Windows, vous pouvez utiliser dos2unix :

sudo dos2unix /usr/local/bin/casperjs

ou sed:

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

Si vous devez modifier des scripts sous Windows, utilisez un éditeur qui gère les fins de ligne Unix (c'est-à-dire quelque chose de moins mortel que le Bloc-notes) et assurez-vous qu'il est configuré pour écrire les fins de ligne Unix (c'est-à-dire LF uniquement) lors de la modification d'un fichier Unix.

Gilles 'SO- arrête d'être méchant'
la source
J'ai rencontré ce problème, mais il a toujours un ^Mà la fin. Je suis exclusivement dans Ubuntu ici mais gedit met parfois ça ^ M parfois, donc je suis allé à Geany. Quoi qu'il en soit, cela donnera une erreur différente et ce n'est pas l'erreur que je vois.
jcollum
1
@jcollum ^Mune autre façon de dire CR.
Gilles 'SO- arrête d'être méchant'
Oui, je comprends cela, mais ce que je dis, c'est que je ne reçois plus cette erreur, donc ce n'est pas un problème de saut de ligne.
jcollum
@jcollum Vous avez supprimé le CR lorsque vous avez modifié la ligne shebang. Si vous le redéfinissez #!/usr/bin/env python(sans rajouter de CR), cela fonctionnera.
Gilles 'SO- arrête d'être méchant'
2
Remarque pour quiconque est confus au sujet de la terminologie: CR = \r= Unicode U + 0D = ^ M (Ctrl + M), et LF = \n= Unicode U + A0 = ^ J (Ctrl + J)
wjandrea
0

J'utilise Visual Studio Code et je suis nouveau dans l'éditeur de texte. Je recevais la même erreur et j'ai essayé manuellement de suivre les étapes de ce message, cela n'a pas fonctionné pour moi. Cependant, dans le coin inférieur droit de Visual Studio Code, vous avez la possibilité de basculer entre CR et LF à la volée, problème résolu. Je ne sais pas si cela s'applique, mais si vous programmez dans un éditeur de texte, il peut fournir une réponse simple en fournissant un bouton pour basculer.

Gerald
la source