web-dev-qa-db-fra.com

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

Essayer de faire fonctionner casperjs sur Ubuntu 12.04. Après l'avoir installé quand je cours, je reçois:

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 il s’agit d’un script python. Mais quand je le lance, je reçois "Aucun fichier de ce type".

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

#!/usr/bin/env python

à:

#!/usr/bin/python

Résultat:

$ casperjs --version
1.1.0-DEV

J'ai réussi à résoudre le problème, mais je me demande pourquoi cela n'a pas fonctionné avec #!/usr/bin/env python, car il semble que ce soit une ligne d'interprétation normale. Est-ce que quelque chose ne va pas?

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
19
jcollum

Si vous voyez l'erreur “: Aucun fichier ou répertoire de ce type” (avec rien avant les deux points), cela signifie que votre ligne Shebang a un retour chariot à la fin, probablement parce qu'elle a été modifiée sous Windows (qui utilise CR, LF comme séparateur de ligne). Le caractère CR amène le curseur à revenir au début de la ligne après que le shell a imprimé le début du message. Ainsi, vous ne verrez 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 un Unix fin de ligne (saut de ligne uniquement). Python lui-même autorise les fins de ligne CRLF, afin que les caractères CR des autres lignes ne fassent pas mal. Les scripts shell, en revanche, 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 intelligent que le Bloc-notes) et assurez-vous qu’il est configuré pour écrire des fins de ligne Unix (c.-à-d. LF uniquement) lorsque éditer un fichier Unix.

35
Gilles