Kịch bản không nhất thiết phải có shebang
Nếu kịch bản được chạy từ người phiên dịch, Bạn không thể chắc chắn nó có công việc ở tất cả . Các tập lệnh, chạy từ trình thông dịch không cần shebang , nếu bạn gọi trình thông dịch để chạy mã.
Do đó, câu trả lời là không, không có lệnh nào sẽ tìm ra chắc chắn ngôn ngữ (trình thông dịch) để chạy tập lệnh là gì. Tuy nhiên, bạn luôn có thể nhìn vào bên trong tập lệnh và xem nó có shebang để tìm hiểu không.
Các quy tắc ngắn gọn:
- Khi bạn chạy tập lệnh, gọi trình thông dịch luôn ghi đè các shebang có thể, có thực thi được hay không, shebang hay không.
- Nếu không thể thực thi và chạy từ trình thông dịch, tập lệnh không cần shebang.
- Nếu tập lệnh được chạy mà không gọi trình thông dịch trước, nó cần (và sử dụng) shebang để tìm hiểu trình thông dịch nào cần gọi và nó cần được thực thi để có "quyền" gọi trình thông dịch từ shebang.
Tuy nhiên, nếu tập lệnh không có shebang, thì không có thông tin (trực tiếp *) bên trong tập lệnh để cho biết trình thông dịch nào sẽ sử dụng.
Có nói rằng
Tất nhiên, bạn luôn có thể viết một tập lệnh bao bọc để cố gắng tìm hiểu xem tập lệnh có shebang hay không và đọc trình thông dịch từ đó, sau đó chạy nó từ trình thông dịch tìm thấy.
Một ví dụ
#!/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")
Lưu nó như tryrun
trong $PATH
(ví dụ: ~/bin
tạo thư mục nếu nó không tồn tại, đăng xuất và đăng nhập lại), làm cho nó thực thi được . Sau đó chạy:
tryrun /path/to/nonexecutablescript
gọi (đã kiểm tra) trình thông dịch chính xác trên các tập lệnh python
và bash
tập lệnh không thực thi của tôi .
Giải trình
- Kịch bản chỉ cần đọc dòng đầu tiên của tập lệnh, loại bỏ
#!
và sử dụng phần còn lại để gọi trình thông dịch.
- Nếu nó không gọi được một thông dịch viên hợp lệ, nó sẽ tăng a
PermissionError
hoặc a FileNotFoundError
.
Ghi chú
Phần mở rộng ( .sh
, .py
v.v.) không có vai trò gì trong việc xác định trình thông dịch phù hợp trên Linux.
(* Tất nhiên có thể phát triển thuật toán đoán "thông minh" để xác định cú pháp từ mã.)