Shebang

Linia '#!’ na początku skryptu wskazująca interpreter, który ma go wykonać (np. #!/bin/bash). Dzięki niej jądro wie, jakim programem uruchomić plik.

Shebang to dwa pierwsze znaki skryptu — #! — po których podajesz ścieżkę do interpretera, np. #!/bin/bash. To nie jest komentarz dla ozdoby ani sugestia dla programisty. To instrukcja dla jądra systemu (kernela), które po niej wie, jakim programem ma uruchomić dany plik. Nazwa to zlepek sharp (#, w slangu „hash/sha”) i bang (!).

Jak to działa

Kiedy wpisujesz w terminalu ./skrypt.sh, system wywołuje execve(). Jądro zagląda do pierwszych bajtów pliku i jeśli widzi magiczną sekwencję #!, traktuje resztę linii jako ścieżkę do interpretera plus opcjonalny argument. Potem uruchamia coś w stylu /bin/bash ./skrypt.sh. Sam shebang nie jest wykonywany — dla samego Basha to zwykły komentarz (zaczyna się od #), więc nikomu nie przeszkadza.

Dzięki temu możesz pisać skrypty w czym chcesz i odpalać je jednakowo. #!/usr/bin/python3 uruchomi plik Pythonem, #!/usr/bin/env node Node’em, a #!/bin/sh POSIX-owym shellem. Bez shebanga system najwyżej zgadnie (zwykle odpala plik domyślnym shellem) albo zwróci błąd exec format error.

Przykład z praktyki

Najczęściej spotkasz dwa warianty. Pierwszy ze sztywną ścieżką:

  • #!/bin/bash — pewne na większości Linuksów, bo Bash zwykle leży w /bin.
  • #!/usr/bin/env python3 — wariant przenośny: env sam znajdzie Pythona w PATH, więc zadziała też tam, gdzie interpreter siedzi gdzie indziej (np. w wirtualnym środowisku czy na macOS z Homebrew).

Żeby skrypt dało się odpalić przez ./skrypt.sh, musi mieć ustawiony bit wykonywalności: chmod +x skrypt.sh. Inaczej system grzecznie odmówi (Permission denied), nawet z poprawnym shebangiem.

Częste błędy

Shebang musi być w pierwszej linii. Pusta linia albo spacja przed #! i magia znika — jądro już go nie rozpozna.

Końcówki linii CRLF z Windowsa. Jeśli edytowałeś plik w Windowsie, na końcu pierwszej linii może wylądować niewidzialny \r. System próbuje wtedy uruchomić /bin/bash\r i wywala bad interpreter: No such file or directory. Klasyczny pożeracz nerwów juniora — ratunek to dos2unix.

Shebang działa tylko przy uruchamianiu pliku jako programu. Gdy odpalasz skrypt jawnie przez bash skrypt.sh, shebang jest ignorowany — interpreter wybierasz ręcznie. To częsta pułapka: skrypt „działa” przez bash, ale nie chce ruszyć przez ./.

Pojęcia powiązane: interpreter, chmod i bity uprawnień, zmienna PATH, /usr/bin/env, syscall execve, magic number, shell (Bash, sh, zsh).