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
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.
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"
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 „!”.
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] *”.
#!
(tyle, ile dmr pamięta…), w tym wyjaśnienie, dlaczego#
(tak, linia musiała zostać zignorowana przez istniejące powłoki).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ą shebangCelowo 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źródło
!
jest często używany w innych kontekstach, aby wskazać polecenie do wykonania. Na przykład wvim
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.źródło
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 „!”.
źródło