Co oznacza wiersz „#! / Bin / sh” w skrypcie powłoki UNIX?

142

Przeglądałem kilka samouczków dotyczących skryptów powłoki i znalazłem następujący przykładowy program:

#!/bin/sh
clear
echo "HELLO WORLD"

Czy ktoś może mi powiedzieć, jakie znaczenie ma komentarz #!/bin/shna początku?

Jake
źródło

Odpowiedzi:

143

Nazywa się on shebang i informuje powłokę nadrzędną, którego interpretera należy użyć do wykonania skryptu.

na przykład

#!/usr/bin/perl   <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

Jest zaimplementowany jako komentarz, więc nic, co pojawia się w tej linii, nie będzie „istotne” dla określonego interpretera. np. wszystkie języki skryptowe mają tendencję do rozumienia, że ​​wiersz zaczynający się od #jest komentarzem, i zignorują !/usr/bin/whateverfragment, który w przeciwnym razie mógłby być błędem składniowym w tym konkretnym języku.

Marc B.
źródło
6
Zwykle to jądro, a nie powłoka, przetwarza to. Powłoka po prostu wywołuje exec()wywołanie systemowe pliku.
tripleee
47

Kiedy spróbujesz uruchomić program w systemie UNIX (taki z ustawionym bitem wykonywalnym), system operacyjny sprawdzi kilka pierwszych bajtów pliku. Tworzą one tak zwaną „magiczną liczbę”, za pomocą której można zdecydować o formacie programu i sposobie jego wykonania.

#!odpowiada magicznej liczbie 0x2321 (sprawdź ją w tabeli ascii). Gdy system widzi tę magiczną liczbę, wie, że ma do czynienia ze skryptem tekstowym i czyta do następnego \n(jest limit, ale ucieka mi w atm). Po zidentyfikowaniu tłumacza (pierwszy argument po shebangu) wezwie tłumacza.

Inne pliki również mają magiczne liczby. Spróbuj spojrzeć na plik mapy bitowej (.BMP) za pośrednictwem, lessa zobaczysz, że pierwsze dwa znaki to BM. Ta magiczna liczba oznacza, że ​​plik jest rzeczywiście bitmapą.

Foo Bah
źródło
10

Jeśli plik, w którym znajduje się ten skrypt, jest wykonywalny, funkcja hash-bang ( #!) informuje system operacyjny, jakiego interpretera należy użyć do uruchomienia skryptu. W tym przypadku jest to /bin/shna przykład.

Jest artykuł w Wikipedii o tym, aby uzyskać więcej informacji.

Kusalananda
źródło
5

Pierwsza linia mówi powłoce, że jeśli wykonujesz skrypt bezpośrednio (./run.sh; w przeciwieństwie do / bin / sh run.sh), powinna użyć tego programu (w tym przypadku / bin / sh) do jego zinterpretowania.

Możesz również użyć go do przekazania argumentów, zwykle -e (wyjście w przypadku błędu) lub użyć innych programów (/ bin / awk, / usr / bin / perl itp.).

Kevin
źródło
-4

#!/bin/shlub #!/bin/bashmusi być pierwszym wierszem skryptu, ponieważ jeśli nie użyjesz go w pierwszym wierszu, system potraktuje wszystkie polecenia w tym skrypcie jako różne polecenia. Jeśli pierwsza linia to, #!/bin/shto potraktuje wszystkie polecenia jako jeden skrypt i pokaże, że ten plik jest uruchomiony w pspoleceniu, a nie polecenia wewnątrz pliku.

./echo.sh

ps -ef |grep echo
trainee   3036  2717  0 16:24 pts/0    00:00:00 /bin/sh ./echo.sh
root      3042  2912  0 16:24 pts/1    00:00:00 grep --color=auto echo
Sarvesh Pawar
źródło
1
Stack Overflow to nie Twitter. Poświęć trochę czasu na przeliterowanie słów, takich jak „u” i „1st”. Pomagasz w pisaniu podręcznika, aby poprawna gramatyka i pisownia były ważne. Zwróć też uwagę na prawidłowe formatowanie. Polecenia, które byłyby wydawane z wiersza poleceń, podobnie jak psi fragmenty kodu, takie jak, #!/bin/shpowinny być sformatowane.
The Tin Man,
Próbowałem tutaj uporządkować angielski, ale nadal nie jestem pewien, co to znaczy. Wydaje mi się, że odpowiedź próbuje powiedzieć, że polecenia w skrypcie będą wykonywane jako odrębne polecenia, a dodanie shebang pokaże skrypt jako pojedyncze polecenie na liście procesów. To nieprawda.
tripleee