Scriptler mutlaka bir shebang yok
Komut yorumlayıcı çalıştırılabilir ise, Bunu shebang sahip olduğundan emin olamaz hiç . Tercüman çalıştırmak komut dosyaları, shebang gerekmez , eğer sen kod çalıştırmasına tercüman diyoruz.
Bu nedenle cevap hayır, komut dosyasının çalışacağı dilin (tercüman) ne olduğundan emin olacak bir komut yok. Bununla birlikte, her zaman senaryo içine bakabilir ve öğrenmek için shebang olup olmadığını görebilirsiniz.
Kısacası kurallar:
- Senaryoyu çalıştırdığınızda, tercümanı çağırmak, her zaman çalıştırılabilir olsun ya da olmasın, olası shebang'ları geçersiz kılar.
- Çalıştırılabilir ve çalıştırın Değilse gelen tercüman, script hiçbir shebang ihtiyacı var.
- Komut ilk tercüman uğramadan çalıştırılırsa, bu ihtiyacı (ve kullanımları) shebang neyi çağrısına tercüman bulmak için, ve onun shebang gelen tercüman çağırmak için "iznine" sahip olmak yürütülebilir olması gerekiyor.
Eğer senaryoda shebang yoksa, hangi tercümanın kullanılacağını söylemek için script içinde hiçbir doğrudan bilgi yoktur.
Bunu söyledikten
Elbette, her zaman kodun shebang olup olmadığını bulmaya çalışmak için bir sarmalayıcı komut dosyası yazabilir ve yorumlayıcıyı bundan okuyabilir, ardından bulunan tercümandan çalıştırabilirsiniz.
Bir örnek
#!/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")
Bunun kaydet tryrun
içinde $PATH
(mesela ~/bin
bunu yapmak, bu mevcut, çıkış yapıp geri vermezse, dizin olun) çalıştırılabilir . Sonra çalışıyor:
tryrun /path/to/nonexecutablescript
çalıştırılamaz python
ve bash
komut dosyalarımdaki doğru tercümanı arar (test eder) .
açıklama
- Betik sadece betiğin ilk satırını okur, kaldırır
#!
ve yorumlayıcıyı çağırmak için gerisini kullanır.
- Geçerli bir tercüman arayamazsa, a
PermissionError
veya a değerini yükseltir FileNotFoundError
.
Not
Uzantı ( .sh
, .py
etc), Linux'taki uygun tercümanı belirlemede hiçbir rol oynamaz.
(* Elbette koddan sözdizimini belirlemek için "akıllı" bir tahmin algoritması geliştirmek mümkündür.)