Dlaczego „She-Bang” zaczyna się od #!
, na przykład #!/bin/bash
? Zawsze akceptowałem to, jak to się robi, ale czy jest po temu jakiś powód?
Po co zacząć #
; czy to zwykle nie jest komentarz? A może chodzi o komentarz?
Dlaczego „She-Bang” zaczyna się od #!
, na przykład #!/bin/bash
? Zawsze akceptowałem to, jak to się robi, ale czy jest po temu jakiś powód?
Po co zacząć #
; czy to zwykle nie jest komentarz? A może chodzi o komentarz?
Odpowiedzi:
Zazwyczaj shebang odnosi się tylko do #!
( !
zwykle jest nazywany „hukiem” i wygląda na to, że „ona” jest zepsuciem „SHArp” lub „haSH” dla #
) - cała linia nazywa się linią shebang
Celowo zaczyna się od znaku komentarza, aby zapewnić zgodność wsteczną z rzeczami, które nie wiedzą, jak sobie z tym poradzić; !
jest przypuszczalnie tylko w celu odróżnienia go od przypadkowej komentarza uruchomieniem pliku, więc plik, który rozpoczyna się # this is my script!
nie próbuje uruchomić this is my script!
interpreter
!
jest często używany w innych kontekstach, aby wskazać polecenie do wykonania. Na przykład w vim
lub w innych programach z własnymi wierszami poleceń bang jest często znakiem ucieczki, który powoduje, że uruchamiają polecenie w powłoce systemowej zamiast w wewnętrznym interfejsie.
Aby to zrozumieć, musisz zdać sobie sprawę, że pierwszy wiersz skryptu jest w rzeczywistości czytany dwukrotnie , przez 2 różne programy. Za pierwszym razem jądro otwiera plik i szuka sekwencji znaków ( #!
) w pierwszym wierszu. Jeśli go znajdzie, uruchamia wskazany tam program powłoki, przekazując nazwę pliku jako parametr. (np. jeśli plik /home/me/foo
zaczyna się od #!/bin/sh
, jądro uruchomi się /bin/sh /home/me/foo
).
Następnie powłoka ( bin/sh
lub inny określony program interpretera) odczytuje plik. Powłoka nie wie nic o liniach shebang, ale nadal będzie czytać pierwszą linię, ponieważ jest jak każda inna linia w pliku ... czyta je wszystkie. Nie chcesz, aby powłoka uległa awarii lub w jakikolwiek sposób zmieniła swoje zachowanie ... sposobem na to, aby traktować ją jako komentarz i zignorować. Zatem najlepszym znakiem dla instrukcji jądra na początek byłby znak komentarza.
Musi to być komentarz, ponieważ tylko w ten sposób będzie działało uruchomienie skryptu typu „interpretername nazwa skryptu”. Nie wiem o pochodzeniu „!”.
#!
(tyle, ile dmr pamięta…), w tym wyjaśnienie, dlaczego#
(tak, linia musiała zostać zignorowana przez istniejące powłoki).