สคริปต์ไม่จำเป็นต้องมี shebang
หากสคริปต์ถูกเรียกใช้จากล่ามคุณไม่สามารถแน่ใจได้ว่ามันมี shebang อยู่เลย สคริปต์ทำงานจากล่ามไม่จำเป็นต้อง shebang , ถ้าคุณเรียกล่ามในการเรียกใช้รหัส
คำตอบคือไม่ไม่มีคำสั่งที่จะตรวจสอบว่าภาษา (ล่าม) คืออะไรเพื่อเรียกใช้สคริปต์ด้วย อย่างไรก็ตามคุณสามารถดูข้างในสคริปต์ได้ตลอดเวลาและดูว่ามี Shebang ให้ค้นหาหรือไม่
กฎในระยะสั้น:
- เมื่อคุณเรียกใช้สคริปต์การเรียกล่ามจะทับ shebangs ที่เป็นไปได้ปฏิบัติการหรือไม่ Shebang หรือไม่ก็ได้
- หากไม่สามารถเรียกใช้งานได้และเรียกใช้จากล่ามสคริปต์จะต้องไม่มี shebang
- หากสคริปต์รันโดยไม่เรียกใช้ล่ามก่อนจำเป็นต้องใช้ (และใช้) shebang เพื่อค้นหาล่ามที่จะเรียกใช้และจำเป็นต้องเรียกใช้งานเพื่อให้มี "สิทธิ์" ในการเรียกล่ามจาก shebang
หากสคริปต์ไม่มี shebang จะไม่มีข้อมูล (direct *) ภายในสคริปต์เพื่อบอกให้ล่ามใช้
ต้องบอกว่า
แน่นอนคุณสามารถเขียนสคริปต์ตัวตัดคำเพื่อลองดูว่าสคริปต์นั้นมี shebang และอ่านล่ามจากที่นั้นหรือไม่ก็เรียกใช้จากล่ามที่พบ
ตัวอย่าง
#!/usr/bin/env python3
import subprocess
import sys
args = sys.argv[1:]; script = args[0]
try:
lang = open(script).readlines()[0].replace("#!", "").strip().split()[-1]
cmd = [lang, script]+args[1:]
subprocess.call(cmd)
except (PermissionError, FileNotFoundError, IndexError):
print("No valid shebang found")
บันทึกเป็นtryrun
ใน$PATH
(เช่น~/bin
สร้างไดเรกทอรีหากไม่มีอยู่ออกจากระบบและกลับเข้ามาใหม่) ทำให้สามารถเรียกใช้งานได้ จากนั้นเรียกใช้:
tryrun /path/to/nonexecutablescript
เรียก (ทดสอบ) ล่ามที่ถูกต้องในสคริปต์ที่ไม่สามารถเรียกใช้งานได้python
และbash
สคริปต์ของฉัน
คำอธิบาย
- สคริปต์จะอ่านบรรทัดแรกของสคริปต์เพียงลบ
#!
และใช้ส่วนที่เหลือเพื่อเรียกล่าม
- ถ้ามันล้มเหลวที่จะเรียกล่ามที่ถูกต้องมันจะยกทั้งหรือ
PermissionError
FileNotFoundError
บันทึก
ส่วนขยาย ( .sh
, .py
ฯลฯ ) เล่นบทบาทใด ๆ ในการกำหนดล่ามที่เหมาะสมบนลินุกซ์
(* แน่นอนว่าเป็นไปได้ในการพัฒนาอัลกอริธึม "smart" เพื่อกำหนดไวยากรณ์จากโค้ด)