Naskah tidak harus memiliki shebang
Jika skrip dijalankan dari interpreter, Anda tidak dapat memastikan ia memiliki shebang sama sekali . Script, jalankan dari interpreter tidak perlu shebang , jika Anda memanggil interpreter untuk menjalankan kode.
Karena itu jawabannya adalah tidak, tidak ada perintah yang akan mencari tahu dengan pasti apa bahasa (penerjemah) untuk menjalankan skrip. Namun Anda selalu dapat melihat ke dalam skrip dan melihat apakah ada shebang untuk mengetahuinya.
Singkatnya aturan:
- Saat Anda menjalankan skrip, memanggil penerjemah selalu mengesampingkan kemungkinan shebang, dieksekusi atau tidak, shebang atau tidak.
- Jika tidak dapat dieksekusi dan dijalankan dari interpreter, skrip tidak memerlukan shebang.
- Jika skrip dijalankan tanpa memanggil juru bahasa terlebih dahulu, ia membutuhkan (dan menggunakan) shebang untuk mengetahui juru bahasa yang akan dipanggil, dan harus dapat dieksekusi untuk memiliki "izin" untuk memanggil penerjemah dari shebang-nya.
Jika skrip tidak memiliki shebang, tidak ada informasi (langsung *) di dalam skrip untuk memberi tahu penerjemah apa yang akan digunakan.
Setelah mengatakan itu
Anda tentu saja selalu dapat menulis skrip pembungkus untuk mencoba mencari tahu apakah skrip tersebut memiliki shebang dan membaca interpreter dari itu, kemudian menjalankannya dari interpreter yang ditemukan.
Sebuah contoh
#!/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")
Simpan sebagai tryrun
di $PATH
(misalnya ~/bin
, membuat direktori jika tidak ada, log out dan kembali), membuatnya dieksekusi . Kemudian jalankan:
tryrun /path/to/nonexecutablescript
panggilan (diuji) penerjemah yang benar pada skrip yang tidak dapat dieksekusi python
dan saya bash
.
Penjelasan
- Script hanya membaca baris pertama dari skrip, menghapus
#!
dan menggunakan sisanya untuk memanggil penerjemah.
- Jika gagal memanggil juru bahasa yang valid, itu akan memunculkan a
PermissionError
atau a FileNotFoundError
.
Catatan
Ekstensi ( .sh
, .py
dll) tidak memainkan peran apa pun dalam menentukan penerjemah yang tepat di Linux.
(* Tentu saja memungkinkan untuk mengembangkan algoritma tebak "pintar" untuk menentukan sintaks dari kode.)