สิ่งที่อาจทำให้สคริปต์ล้มเหลวในการค้นหา python เมื่อมันมี `#! / usr / bin / env python` ในบรรทัดแรก


19

พยายามทำให้ casperjs ทำงานบน Ubuntu 12.04 หลังจากติดตั้งเมื่อฉันเรียกใช้ฉันได้รับ:

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

ดังนั้น Python จึงปรากฏและรันได้ casperjs จะชี้ไปยังตำแหน่งที่ถูกต้องและเป็นสคริปต์ python แต่เมื่อฉันเรียกใช้ฉันได้รับ "ไม่มีไฟล์ดังกล่าว"

ฉันสามารถแก้ไขได้โดยเปลี่ยนบรรทัดแรกของไฟล์ casperjs python จาก:

#!/usr/bin/env python

ถึง:

#!/usr/bin/python

ผลลัพธ์:

$ casperjs --version
1.1.0-DEV

ฉันจัดการเพื่อแก้ไข แต่ฉันสงสัยว่าทำไมมันไม่ทำงานด้วย#!/usr/bin/env pythonเนื่องจากดูเหมือนว่าจะเป็นบรรทัดล่ามปกติ ฉันมีบางสิ่งผิดปกติหรือไม่

นี่คือขั้นตอนในการรับ 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

คุณสามารถลองใช้strace /usr/local/bin/casperjsกับรุ่นที่ไม่ทำงานได้หรือไม่? จะเป็นประโยชน์หากเราเห็นว่าไฟล์ env พยายามเรียกใช้งานและไม่ว่า env จะล้มเหลวในการค้นหา python หรือ python ไม่สามารถเปิดสคริปต์ได้หรือไม่
Mark Plotnick

@ MarkPlotnick ทำอย่างนั้น 100s ของบรรทัดเอาต์พุตมีอะไรเป็นพิเศษบ้างไหม?
jcollum

บรรทัดใด ๆ ที่ปล่อยออกมาก่อนที่จะ: No such file or directoryถูกส่งออกที่มีความพยายามของ execve [แก้ไข: เพิ่งเห็นคำตอบของ Gilles ตรวจสอบบรรทัดในเอาต์พุต strace ที่มีลักษณะexecve("/usr/bin/python\r", ...)ดังนี้ ]
Mark Plotnick

คำตอบ:


36

หากคุณเห็นข้อผิดพลาด“: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว” (โดยที่ไม่มีอะไรมาก่อนเครื่องหมายโคลอน) แสดงว่าบรรทัด shebang ของคุณมีการขึ้นบรรทัดใหม่ในตอนท้ายอาจสันนิษฐานได้ว่ามันถูกแก้ไขใน Windows (ซึ่งใช้ CR, LF เป็น ตัวแยกบรรทัด) อักขระ CR ทำให้เคอร์เซอร์เลื่อนกลับไปที่จุดเริ่มต้นของบรรทัดหลังจากเชลล์พิมพ์จุดเริ่มต้นของข้อความและเพื่อให้คุณเห็นเฉพาะส่วนหลังจาก CR ซึ่งสิ้นสุดสตริงล่ามที่เป็นส่วนหนึ่งของข้อความแสดงข้อผิดพลาด

ลบ CR: บรรทัด shebang ต้องมีการสิ้นสุดบรรทัด Unix (เฉพาะการป้อนบรรทัดเท่านั้น) Python อนุญาตให้สิ้นสุดบรรทัด CRLF ดังนั้นอักขระ CR ในบรรทัดอื่น ๆ จะไม่เจ็บ เชลล์สคริปต์ในอีกทางหนึ่งจะต้องไม่มีอักขระ CR

ในการลบการจบบรรทัด Windows คุณสามารถใช้dos2unix :

sudo dos2unix /usr/local/bin/casperjs

หรือ sed:

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

หากคุณต้องแก้ไขสคริปต์ใน Windows ให้ใช้โปรแกรมแก้ไขที่ลงท้ายด้วย Unix line endings (นั่นคือบางอย่างที่สมองตายกว่า Notepad) และตรวจสอบให้แน่ใจว่ามันได้รับการกำหนดค่าให้เขียน Unix line endings (เช่น LF เท่านั้น) เมื่อแก้ไขไฟล์ Unix


ฉันพบปัญหานี้แล้ว แต่มันมี^Mที่สิ้นสุดเสมอ ฉันเป็นคนเดียวในอูบุนตูที่นี่ แต่บางครั้ง gedit ก็ยังใส่ ^ M ดังนั้นฉันจึงไป Geany อย่างไรก็ตามมันจะให้ข้อผิดพลาดที่แตกต่างกันและนั่นไม่ใช่ข้อผิดพลาดที่ฉันเห็น
jcollum

1
@jcollum ^Mอีกวิธีพูด CR
Gilles 'หยุดความชั่วร้าย'

ใช่ฉันเข้าใจว่า แต่สิ่งที่ฉันพูดคือฉันไม่ได้รับข้อผิดพลาดนั้นอีกต่อไปดังนั้นจึงไม่ใช่ปัญหาการแบ่งบรรทัด
jcollum

@jcollum คุณลบ CR เมื่อคุณแก้ไขบรรทัด shebang หากคุณเปลี่ยนกลับเป็น#!/usr/bin/env python(โดยไม่ต้องเพิ่ม CR กลับ) มันจะทำงาน
Gilles 'หยุดความชั่วร้าย'

2
หมายเหตุสำหรับทุกคนที่สับสนเกี่ยวกับคำศัพท์: CR = \r= Unicode U + 0D = ^ M (Ctrl + M) และ LF = \n= Unicode U + A0 = ^ J (Ctrl + J)
wjandrea

0

ฉันใช้ Visual Studio Code และฉันใหม่กับโปรแกรมแก้ไขข้อความ ฉันได้รับข้อผิดพลาดเดียวกันและลองทำตามขั้นตอนในโพสต์นี้ด้วยตนเองมันไม่ได้ผลสำหรับฉัน อย่างไรก็ตามใน Visual Studio Code ที่มุมล่างขวามีตัวเลือกให้สลับระหว่าง CR และ LF ได้ทันทีการแก้ไขปัญหา ฉันไม่แน่ใจว่าสิ่งนี้ใช้ได้หรือไม่หากคุณกำลังเขียนโปรแกรมในโปรแกรมแก้ไขข้อความอาจให้คำตอบง่ายๆโดยการกดปุ่มเพื่อสลับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.