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


Mencoba mendapatkan casperjs berjalan 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 runnable, casperjs menunjuk ke tempat yang tepat dan itu adalah skrip python. Tetapi ketika saya menjalankannya saya mendapatkan "Tidak ada file seperti itu".

Saya bisa 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 itu tampaknya menjadi jalur juru bahasa normal. Apakah saya memiliki sesuatu yang salah dikonfigurasi?

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

16
2017-11-07 20:25


asal


Bisakah Anda mencoba berlari strace /usr/local/bin/casperjs pada versi tidak bekerja? Akan sangat membantu jika kita bisa melihat file mana yang env coba ke exec, dan apakah env gagal menemukan python atau python gagal membuka skrip. - Mark Plotnick
@MarkPlotnick menjalankannya, 100 baris output, apa saja khususnya? - jcollum
Setiap baris yang dipancarkan sesaat sebelum : No such file or directory menjadi output yang berisi percobaan execve. [edit: hanya melihat jawaban Gilles. Periksa garis dalam output strace yang terlihat seperti execve("/usr/bin/python\r", ...). ] - Mark Plotnick


Jawaban:


Jika Anda melihat kesalahan ": Tidak ada file atau direktori seperti itu" (dengan tidak ada sebelum titik dua), itu berarti bahwa garis shebang Anda memiliki pengembalian carriage di akhir, mungkin karena itu diedit di bawah Windows (yang menggunakan CR, LF sebagai pemisah garis). Karakter CR menyebabkan kursor untuk kembali ke awal baris setelah shell mencetak awal pesan dan Anda hanya bisa melihat bagian setelah CR yang mengakhiri string interpreter yang merupakan bagian dari pesan kesalahan.

Hapus CR: garis shebang harus memiliki Unix akhiran garis (hanya linefeed). Python sendiri memungkinkan akhiran garis CRLF, jadi karakter CR di jalur lain tidak sakit. Skrip 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 Windows, gunakan editor yang menangani akhiran baris Unix (yaitu sesuatu yang kurang otak mati daripada Notepad) dan pastikan bahwa itu dikonfigurasi untuk menulis akhiran baris Unix (yaitu hanya LF) saat mengedit file Unix.


32
2017-11-07 21:13



Saya telah mengalami masalah ini tetapi selalu memiliki ^M pada akhirnya. Saya secara eksklusif di Ubuntu di sini tetapi masih gedit menempatkan bahwa kadang-kadang, jadi saya pergi ke Geany. Bagaimanapun itu akan memberikan kesalahan yang berbeda dan itu bukan kesalahan yang saya lihat. - jcollum
@jcollum ^M cara lain untuk mengatakan CR. - Gilles
Ya, saya mengerti itu, tetapi yang saya katakan adalah bahwa saya tidak mendapatkan kesalahan itu lebih lama lagi, jadi ini bukan masalah pembobolan baris. - jcollum
@jcollum Anda menghapus CR saat Anda mengedit garis shebang. Jika Anda mengubahnya kembali #!/usr/bin/env python (tanpa menambahkan kembali CR), itu akan bekerja. - Gilles
Catatan untuk siapa pun bingung tentang terminologi: CR = \r = Unicode U + 0D = ^ M (Ctrl + M), dan LF = \n = Unicode U + A0 = ^ J (Ctrl + J) - wjandrea