o que poderia fazer com que um script não consiga localizar o python quando ele tiver '#! / usr / bin / env python' na primeira linha?

15

Tentando executar o casperjs no Ubuntu 12.04. Depois de instalá-lo quando eu corro eu recebo:

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

Então Python está presente e rodável, o casperjs está apontando para o lugar certo e é um script python. Mas quando eu corro, eu recebo "No such file".

Eu posso consertar isso alterando a primeira linha do arquivo python casperjs de:

#!/usr/bin/env python

para:

#!/usr/bin/python

Resultado:

$ casperjs --version
1.1.0-DEV

Consegui consertar, mas estou me perguntando por que não funcionou com #!/usr/bin/env python , já que parece ser uma linha de intérprete normal. Eu tenho algo configurado errado?

Aqui estão os passos para obter os 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
    
por jcollum 07.11.2013 / 21:25

1 resposta

28

Se você vir o erro ": Nenhum arquivo ou diretório" (sem nada antes dos dois pontos), significa que sua linha shebang tem um retorno de carro no final, presumivelmente porque foi editada no Windows (que usa CR LF como um separador de linha). O caractere CR faz com que o cursor volte para o início da linha depois que o shell imprime o início da mensagem e você só consegue ver a parte após CR, que finaliza a string do interpretador que faz parte da mensagem de erro.

Remova o CR: a linha shebang precisa ter uma linha final do Unix (apenas alimentação de linha). O próprio Python permite terminações de linha CRLF, portanto os caracteres CR em outras linhas não são prejudiciais. Os scripts shell, por outro lado, devem estar livres de caracteres CR.

Para remover as terminações de linha do Windows, você pode usar dos2unix :

sudo dos2unix /usr/local/bin/casperjs

ou sed:

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

Se você tiver que editar scripts no Windows, use um editor que lide com finais de linha do Unix (ou seja, algo menos estressado do que o Bloco de Notas) e verifique se está configurado para gravar finais de linha do Unix (ou seja, somente LF) ao editar um Unix arquivo.

    
por Gilles 07.11.2013 / 22:13