exec
Linux çekirdeğinin sistem çağrısı (shebangs anlar #!
yerel)
Bash yaparken:
./something
Linux'ta, bu exec
sistem çağrısı yolu ile çağırır ./something
.
Çekirdeğin bu satırı iletilen dosyaya çağrılır exec
: https://github.com/torvalds/linux/blob/v4.8/fs/binfmt_script.c#L25
if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!'))
Dosyanın ilk baytlarını okur ve karşılaştırır #!
.
Karşılaştırma doğruysa, satırın geri kalanı Linux çekirdeği tarafından ayrıştırılır; bu , ilk bağımsız değişken olarak exec
path /usr/bin/env python
ve current dosyasıyla başka bir çağrı yapar :
/usr/bin/env python /path/to/script.py
ve bu #
, yorum karakteri olarak kullanılan herhangi bir komut dosyası dili için işe yarar .
Ve evet, ile sonsuz bir döngü yapabilirsiniz:
printf '#!/a\n' | sudo tee /a
sudo chmod +x /a
/a
Bash hatayı tanır:
-bash: /a: /a: bad interpreter: Too many levels of symbolic links
#!
sadece insan tarafından okunabilir olur, ancak bu gerekli değildir.
Dosya farklı baytlarla exec
başlarsa , sistem çağrısı farklı bir işleyici kullanır. Diğer en önemli dahili işleyici ELF çalıştırılabilir dosyalar için geçerli: https://github.com/torvalds/linux/blob/v4.8/fs/binfmt_elf.c#L1305 bayt kontrolü yaptığı 7f 45 4c 46
aynı zamanda insan olur ki ( için okunabilir .ELF
). /bin/ls
ELF çalıştırılabilir olan ilk 4 baytı okuyarak onaylayalım :
head -c 4 "$(which ls)" | hd
çıktı:
00000000 7f 45 4c 46 |.ELF|
00000004
Böylece, çekirdek bu baytları gördüğünde, ELF dosyasını alır, doğru şekilde belleğe koyar ve onunla yeni bir işlem başlatır. Ayrıca bakınız: https://stackoverflow.com/questions/8352535/how-does-kernel-get-an-executable-binary-file-running-under-linux/31394861#31394861
Sonunda, kendi Shebang işleyicilerini binfmt_misc
mekanizma ile ekleyebilirsin . Örneğin, dosyalar için özel bir işleyici.jar
ekleyebilirsiniz . Bu mekanizma, dosya uzantısına göre işleyicileri bile destekler. Başka bir uygulama, farklı bir mimarinin yürütülebilirlerini şeffaf bir şekilde QEMU ile çalıştırmaktır .
Ancak POSIX'in shebangları belirttiğini sanmıyorum:: ps ps ps ps ps htt ps ps ps: https://unix.stackexchange.com/a/346214/32558 , gerekçeli bölümlerde ve çalıştırılabilir komut dosyaları sistem tarafından destekleniyorsa olabilir ".
chmod +x my_shell_script.sh ; /path/to/my_shell_script.sh # or ./my_shell_script.sh if you happen to be in its directory