o que poderia causar um script que falha ao encontrar o python quando ele tem `#! / usr / bin / env python` na primeira linha?

19

Tentando rodar o casperjs no Ubuntu 12.04. Depois de instalá-lo quando executo, 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

Portanto, o Python está presente e pode ser executado, o casperjs está apontando para o lugar certo e é um script python. Mas quando o executo, recebo "Esse arquivo não existe".

Posso corrigi-lo alterando a primeira linha do arquivo python casperjs de:

#!/usr/bin/env python

para:

#!/usr/bin/python

Resultado:

$ casperjs --version
1.1.0-DEV

Eu consegui consertá-lo, mas estou me perguntando por que não funcionou #!/usr/bin/env python, já que parece ser uma linha de intérprete normal. Tenho algo configurado errado?

Aqui estão as etapas para obter o 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
fonte
Você pode tentar rodar strace /usr/local/bin/casperjsna versão não útil? Seria útil se pudéssemos ver quais arquivos o env tenta executar, e se o env está falhando em encontrar python ou python está falhando em abrir o script.
Mark Plotnick
@ MarkPlotnick executou isso, centenas de linhas de saída, algo em particular?
Jcollum
Quaisquer linhas emitidas antes da : No such file or directorysaída que contenham tentativas de execve. [editar: apenas vi a resposta de Gilles. Verifique se há linhas na saída strace que se parecem execve("/usr/bin/python\r", ...). ]
Mark Plotnick

Respostas:

36

Se você vir o erro “: Não existe esse arquivo ou diretório” (sem nada antes dos dois pontos), significa que sua linha shebang possui um retorno de carro no final, provavelmente porque foi editada no Windows (que usa CR, LF como um separador de linha). O caractere CR faz com que o cursor volte ao início da linha depois que o shell imprime o início da mensagem e, portanto, você só consegue ver a parte após o CR que encerra a sequência do interpretador que faz parte da mensagem de erro.

Remova o CR: a linha shebang precisa ter uma linha Unix finalizada (apenas avanço de linha). O próprio Python permite terminações de linha CRLF, para que os caracteres CR em outras linhas não sejam prejudicados. Os scripts de shell, por outro lado, devem estar livres de caracteres CR.

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

sudo dos2unix /usr/local/bin/casperjs

ou sed:

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

Se você precisar editar scripts no Windows, use um editor que lide com as terminações de linha do Unix (ou seja, com menos morte cerebral que o Bloco de Notas) e verifique se ele está configurado para gravar as terminações de linha do Unix (somente LF) ao editar um arquivo Unix.

Gilles 'SO- parar de ser mau'
fonte
Eu corri para esse problema, mas ele sempre tem um ^Mno final. Estou exclusivamente no Ubuntu aqui, mas ainda assim o gedit coloca esse ^ M às vezes, então fui para o Geany. De qualquer forma, isso dará um erro diferente e esse não é o erro que estou vendo.
Jcollum
1
@jcollum ^Moutra maneira de dizer CR.
Gilles 'SO- stop be evil'
Sim, eu entendo isso, mas o que estou dizendo é que não estou mais recebendo esse erro, por isso não é um problema de quebra de linha.
Jcollum #
@jcollum Você removeu o CR quando editou a linha shebang. Se você alterá-lo novamente para #!/usr/bin/env python(sem adicionar novamente um CR), ele funcionará.
Gilles 'SO- stop be evil'
2
Nota para qualquer um confundido sobre a terminologia: CR = \r= Unicode L + 0D ^ = M (+ M), e LF = \n= Unicode L + A0 = ^ J (Ctrl + J)
wjandrea
0

Estou usando o Visual Studio Code e sou novo no editor de texto. Eu estava recebendo o mesmo erro e tentei seguir as etapas manualmente neste post, não funcionou para mim. No entanto, no canto inferior direito do código do Visual Studio, é possível alternar entre CR e LF em tempo real, problema resolvido. Não tenho certeza se isso se aplica, mas se você estiver programando em um editor de texto, ele pode fornecer uma resposta simples, fornecendo um botão para alternar.

Gerald
fonte