apa yang dapat menyebabkan skrip gagal menemukan python ketika ia memiliki `#! / usr / bin / env python` di baris pertama?

19

Mencoba menjalankan casperjs di Ubuntu 12.04. Setelah menginstalnya ketika saya menjalankan saya mendapatkan:

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

Jadi Python hadir dan dapat dijalankan, casperjs menunjuk ke tempat yang tepat dan itu adalah skrip python. Tetapi ketika saya menjalankannya saya mendapatkan "Tidak ada file seperti itu".

Saya dapat memperbaikinya dengan mengubah baris pertama dari file python casperjs dari:

#!/usr/bin/env python

untuk:

#!/usr/bin/python

Hasil:

$ casperjs --version
1.1.0-DEV

Saya berhasil memperbaikinya, tetapi saya bertanya-tanya mengapa itu tidak berhasil #!/usr/bin/env python, karena sepertinya itu adalah garis juru bahasa yang normal. Apakah saya salah mengonfigurasi?

Berikut langkah-langkah untuk mendapatkan 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
sumber
Bisakah Anda mencoba menjalankan strace /usr/local/bin/casperjspada versi yang tidak bekerja? Akan sangat membantu jika kita dapat melihat file mana yang mencoba untuk dijalankan oleh env, dan apakah env gagal menemukan python atau python gagal membuka skrip.
Mark Plotnick
@MarkPlotnick menjalankannya, 100-an garis output, apa pun khususnya?
jcollum
Setiap baris yang dipancarkan tepat sebelum : No such file or directorymenjadi output yang berisi usaha yang dijalankan. [edit: hanya melihat jawaban Gilles. Periksa baris dalam output strace yang terlihat execve("/usr/bin/python\r", ...). ]
Mark Plotnick

Jawaban:

36

Jika Anda melihat kesalahan ": Tidak ada file atau direktori" (tanpa apa pun sebelum titik dua), itu berarti garis shebang Anda memiliki carriage return di bagian akhir, mungkin karena itu diedit di Windows (yang menggunakan CR, LF sebagai pemisah baris). Karakter CR menyebabkan kursor bergerak kembali ke awal baris setelah shell mencetak awal pesan dan jadi Anda hanya bisa melihat bagian setelah CR yang mengakhiri string juru bahasa yang merupakan bagian dari pesan kesalahan.

Hapus CR: garis shebang perlu memiliki akhiran baris Unix (hanya linefeed). Python sendiri memungkinkan ujung garis CRLF, sehingga karakter CR di baris lain tidak sakit. Script shell di sisi lain harus bebas dari karakter CR.

Untuk menghapus ujung garis Windows, Anda dapat menggunakan dos2unix :

sudo dos2unix /usr/local/bin/casperjs

atau sed:

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

Jika Anda harus mengedit skrip di bawah Windows, gunakan editor yang berupaya dengan ujung garis Unix (yaitu sesuatu yang lebih sedikit mati otak daripada Notepad) dan pastikan bahwa itu dikonfigurasikan untuk menulis ujung garis Unix (yaitu hanya LF) saat mengedit file Unix.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya mengalami masalah ini tetapi selalu ada ^Mdi akhir. Saya secara eksklusif di Ubuntu di sini tetapi masih gedit menempatkan ^ M di kadang-kadang, jadi saya pergi ke Geany. Pokoknya itu akan memberikan kesalahan yang berbeda dan itu bukan kesalahan yang saya lihat.
jcollum
1
@ jcollum ^Mcara lain untuk mengatakan CR.
Gilles 'SO- stop being evil'
Ya saya mengerti itu, tetapi yang saya katakan adalah bahwa saya tidak mendapatkan kesalahan itu lagi, jadi itu bukan masalah line break.
jcollum
@ jcollum Anda menghapus CR ketika Anda mengedit baris shebang. Jika Anda mengubahnya kembali ke #!/usr/bin/env python(tanpa menambahkan kembali CR), itu akan berfungsi.
Gilles 'SO- stop being evil'
2
Catatan untuk siapa pun yang bingung tentang terminologi: CR = \r= Unicode U + 0D = ^ M (Ctrl + M), dan LF =\n = Unicode U + A0 = ^ J (Ctrl + J)
wjandrea
0

Saya menggunakan Visual Studio Code dan saya baru ke editor teks. Saya menerima kesalahan yang sama dan mencoba secara manual mengikuti langkah-langkah dalam posting ini, itu tidak berhasil untuk saya. Namun, dalam Visual Studio Code sudut kanan bawah memberikan opsi untuk beralih antara CR dan LF on the fly, masalah diselesaikan. Saya tidak yakin apakah ini berlaku tetapi jika Anda memprogram dalam editor teks mungkin memberikan jawaban sederhana dengan menyediakan tombol untuk beralih.

Gerald
sumber