Dlaczego „She-Bang” zaczyna się od „#!”?

10

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?

Johan
źródło
4
Wikipedia ma dość szczegółową historię #!(tyle, ile dmr pamięta…), w tym wyjaśnienie, dlaczego #(tak, linia musiała zostać zignorowana przez istniejące powłoki).
Gilles „SO- przestań być zły”,
Pominięto sprawdzenie wikipedii :)
Johan
1
Chciałbym tylko, aby pociski były wystarczająco inteligentne, aby usunąć obce CR / LF, jeśli tam jest ...;)
Aaron D. Marasco,

Odpowiedzi:

16

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

Michał Mrożek
źródło
2
Bang !jest często używany w innych kontekstach, aby wskazać polecenie do wykonania. Na przykład w vimlub 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.
Caleb
4

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/foozaczyna się od #!/bin/sh, jądro uruchomi się /bin/sh /home/me/foo).

Następnie powłoka ( bin/shlub 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.

JoelFan
źródło
Czy to naprawdę jądro to robi, wygląda na to, że to bieżąca powłoka, w której pracujesz, przeanalizuje shebang, a następnie prześle skrypt
Johan
Nie ... to samo jądro, na żywo i osobiście. Będzie działać, nawet jeśli nie używasz powłoki do wykonania skryptu ... istnieją inne sposoby wykonania pliku poza powłoką ... na przykład z programu C, przy użyciu wywołania systemowego "exec"
JoelFan
en.wikipedia.org/wiki/Shebang_(Unix)#Magic_number "#!" w ascii bajty 0x23 0x21 - gdy exec () widzi te bajty, zachowanie traktuje resztę linii jako ścieżkę do interpretera.
Aaron McMillin
1

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 „!”.

Sven Geggus
źródło
1
Nawet jeśli po prostu uruchomisz ./scriptname, tłumacz nadal widzi linię she-bang, więc nadal musi to być komentarz.
psusi
1
Lub bardziej szczegółowo: shebang: „#!” jest zaprojektowany tak, aby nie był widoczny dla tłumacza - dlatego musi zaczynać się od komentarza char '#'. Zamiast tego jest „widziany” (i interpretowany) przez zestaw wywołań systemowych jądra „exec [lv] *”.
arielf