shebang line ไม่ทำงานกับ cr-lf


10

ทำไมส่วนของ shebang ของสคริปต์พื้นฐานต่อไปนี้จึงไม่ทำงาน:

$ cat hello.sh
#! /bin/sh
echo Hello
$ ./hello.sh
bash: ./hello.sh: /bin/sh^M: bad interpreter: No such file or directory

$ cat hello.py
#! /usr/bin/env python3
print("Hello")
$ ./hello.py
: No such file or directory

ในขณะที่การเรียกล่ามด้วยตนเองทำงาน:

$ sh hello.sh
Hello
$ python3 hello.py
Hello

คำตอบ:


11

สคริปต์ของคุณอาจมีจุดสิ้นสุดบรรทัด 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แล้ว) นี่เป็นเหตุผลที่เป็นไปได้

หมายเหตุ: ขอบคุณคนอื่น ๆ ที่แสดงความคิดเห็นด้วย ฉันก็ยินดีที่จะได้ยินหากมีคำตอบที่ดีกว่า!

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