Điều gì có thể khiến tập lệnh không tìm thấy python khi nó có `#! / usr / bin / env python` trong dòng đầu tiên?


19

Đang cố gắng để casperjs chạy trên Ubuntu 12.04. Sau khi cài đặt nó khi tôi chạy, tôi nhận được:

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

Vì vậy, Python có mặt và có thể chạy được, casperjs đang chỉ đúng nơi và đó là một kịch bản python. Nhưng khi tôi chạy nó, tôi nhận được "Không có tập tin như vậy".

Tôi có thể sửa nó bằng cách thay đổi dòng đầu tiên của tệp python casperjs từ:

#!/usr/bin/env python

đến:

#!/usr/bin/python

Kết quả:

$ casperjs --version
1.1.0-DEV

Tôi đã cố gắng sửa nó, nhưng tôi tự hỏi tại sao nó không hoạt động #!/usr/bin/env python, vì đó dường như là một dòng phiên dịch bình thường. Tôi có một cái gì đó cấu hình sai?

Dưới đây là các bước để có được 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

Bạn có thể thử chạy strace /usr/local/bin/casperjstrên phiên bản không hoạt động? Sẽ hữu ích nếu chúng ta có thể xem tệp nào env cố thực thi và liệu env không tìm thấy python hay python không mở được script.
Đánh dấu Plotnick

@MarkPlotnick đã chạy nó, 100 dòng sản phẩm, cụ thể là gì?
jcollum

Bất kỳ dòng nào được phát ra ngay trước khi : No such file or directorylà đầu ra có chứa nỗ lực thực thi. [sửa: chỉ thấy câu trả lời của Gilles. Kiểm tra các dòng trong đầu ra strace trông như thế nào execve("/usr/bin/python\r", ...). ]
Đánh dấu Plotnick

Câu trả lời:


36

Nếu bạn thấy lỗi, không có tập tin hoặc thư mục nào như vậy (không có gì trước dấu hai chấm), điều đó có nghĩa là dòng shebang của bạn có trả lại vận chuyển ở cuối, có lẽ là do nó đã được chỉnh sửa trong Windows (sử dụng CR, LF làm đường phân cách). Ký tự CR làm cho con trỏ di chuyển trở lại đầu dòng sau khi trình bao in phần đầu của thông báo và do đó bạn chỉ có thể thấy phần sau CR kết thúc chuỗi trình thông dịch là một phần của thông báo lỗi.

Loại bỏ CR: dòng shebang cần phải có dòng Unix kết thúc (chỉ cho ăn theo dòng). Bản thân Python cho phép kết thúc dòng CRLF, vì vậy các ký tự CR trên các dòng khác không bị tổn thương. Mặt khác, các kịch bản Shell phải không có ký tự CR.

Để loại bỏ các kết thúc dòng Windows, bạn có thể sử dụng dos2unix :

sudo dos2unix /usr/local/bin/casperjs

hoặc sed:

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

Nếu bạn phải chỉnh sửa tập lệnh trong Windows, hãy sử dụng trình chỉnh sửa đối phó với các kết thúc dòng Unix (nghĩa là một cái gì đó ít não hơn so với Notepad) và đảm bảo rằng nó được cấu hình để viết các kết thúc dòng Unix (ví dụ như chỉ có LF) khi chỉnh sửa tệp Unix.


Tôi đã gặp phải vấn đề này nhưng nó luôn luôn có một ^Mkết thúc. Tôi độc quyền ở Ubuntu ở đây nhưng vẫn thỉnh thoảng đưa nó vào ^ M, vì vậy tôi đã đến Geany. Dù sao, nó sẽ đưa ra một lỗi khác và đó không phải là lỗi mà tôi đang thấy.
jcollum

1
@jcollum ^Mmột cách khác để nói CR.
Gilles 'SO- ngừng trở nên xấu xa'

Vâng, tôi hiểu điều đó nhưng điều tôi đang nói là tôi sẽ không gặp phải lỗi đó nữa, vì vậy đó không phải là vấn đề ngắt dòng.
jcollum

@jcollum Bạn đã xóa CR khi bạn chỉnh sửa dòng shebang. Nếu bạn thay đổi lại thành #!/usr/bin/env python(không thêm CR), nó sẽ hoạt động.
Gilles 'SO- ngừng trở nên xấu xa'

2
Lưu ý cho bất kỳ ai nhầm lẫn về thuật ngữ: CR = \r= Unicode U + 0D = ^ M (Ctrl + M) và LF = \n= Unicode U + A0 = ^ J (Ctrl + J)
wjandrea

0

Tôi đang sử dụng Visual Studio Code và chưa quen với trình soạn thảo văn bản. Tôi đã nhận được lỗi tương tự và đã thử các bước theo cách thủ công trong bài đăng này, nó không hoạt động đối với tôi. Tuy nhiên, trong Visual Studio Code, góc dưới bên phải cung cấp tùy chọn để chuyển đổi giữa CR và LF khi đang di chuyển, vấn đề đã được giải quyết. Tôi không chắc chắn nếu điều này áp dụng nhưng nếu bạn đang lập trình trong trình soạn thảo văn bản, nó có thể cung cấp một câu trả lời đơn giản bằng cách cung cấp một nút để chuyển đổi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.