สคริปต์ของคุณอาจมีจุดสิ้นสุดบรรทัด CR-LF สไตล์ DOS และไม่ใช่จุดสิ้นสุดบรรทัด LF สไตล์ Unix ^ M ที่เห็นในข้อความแสดงข้อผิดพลาดในกรณีแรกเป็นการบ่งชี้ว่าอักขระ 0D ถูกตีความว่าเป็นส่วนหนึ่งของชื่อล่ามสคริปต์และไม่เป็นส่วนหนึ่งของการสิ้นสุดบรรทัด (เป็นหนึ่งอาจคาดว่าจะเป็น) เนื่องจากไม่มีไฟล์ที่เรียกใช้งานได้ในระบบของคุณที่มีพา ธ ที่มีอักขระ 0D (^ M) ระบบจึงไม่สามารถเรียกล่ามได้ เมื่อคุณโทรหาล่ามของคุณด้วยตนเองมันจะสามารถจัดการการสิ้นสุดของบรรทัดทั้งสองประเภทที่ปรากฏในสคริปต์
หากคุณแปลงสคริปต์เพื่อใช้การสิ้นสุดบรรทัด LF สไตล์ Unix คุณควรเห็น shebang ทำงาน อ่านต่อเพื่อเป็นภาพประกอบ
ในเซสชั่นด้านล่าง todos และ fromdos เป็นโปรแกรมอรรถประโยชน์ (มีให้ใน Ubuntu เป็นแพ็คเกจtofrodos
) เพื่อแปลงระเบียบการสิ้นสุดบรรทัดจาก CR-LF เป็น LF ยูทิลิตี้ที่เทียบเท่าใด ๆ (ดูคำถาม unix.SE นี้ ) จะทำเพื่อการสาธิต
ทรานสคริปต์เซสชันต่อไปนี้ (ดำเนินการด้วยไฟล์สคริปต์เดียวกันของคุณ) ควรชี้แจงสถานการณ์:
$ fromdos hello.sh
$ ./hello.sh
Hello
$ todos hello.sh
$ ./hello.sh
bash: ./hello.sh: /bin/sh^M: bad interpreter: No such file or directory
$
$ fromdos hello.py
$ ./hello.py
Hello
$ todos hello.py
$ ./hello.py
: No such file or directory
$
มันดูเหมือนว่ามันเป็นเคอร์เนลที่อ่านบรรทัด shebang และเห็นได้ชัดว่าลินุกซ์ (อย่างน้อยเป็นของรุ่นในระบบ Kubuntu ทะลึ่งของฉัน) ไม่รู้จัก CR เป็นส่วนหนึ่งของการประชุม CR-LF เส้นสิ้นสุด
หาก shebang ของสคริปต์ของคุณไม่ทำงาน (เช่นการเรียกล่ามในสคริปต์ทำงานด้วยตนเอง แต่คุณไม่สามารถเรียกใช้สคริปต์โดยใช้ชื่อไฟล์แม้ว่าคุณจะทำเสร็จchmod +x
แล้ว) นี่เป็นเหตุผลที่เป็นไปได้
หมายเหตุ:
ขอบคุณคนอื่น ๆ ที่แสดงความคิดเห็นด้วย ฉันก็ยินดีที่จะได้ยินหากมีคำตอบที่ดีกว่า!