Co robi linia"#!/bin / sh" oznacza w skrypcie powłoki Uniksa?

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

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

Czy ktoś może powiedzieć jakie jest znaczenie wzmianki " !/bin/sh" w komentarzu?

Author: the Tin Man, 2011-09-09

5 answers

Nazywa się shebang i mówi powłoce nadrzędnej, który interpreter powinien być użyty do wykonania skryptu.

Np.

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

Jest zaimplementowany jako komentarz tak, że cokolwiek pojawi się w tej linii nie będzie "istotne" dla podanego interpretera. na przykład wszystkie języki skryptowe mają tendencję do rozumienia, że linia zaczynająca się od # jest komentarzem i ignoruje część !/usr/bin/whatever, co w przeciwnym razie może być błędem składni w danym języku.

 120
Author: Marc B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-04 12:38:27

Podczas próby uruchomienia programu w systemie unix (takiego z ustawionym bitem wykonywalnym), system operacyjny spojrzy na kilka pierwszych bajtów pliku. Tworzą one tak zwaną "liczbę magiczną", która może być używana do decydowania o formacie programu i sposobu jego wykonania.

#! odpowiada magicznej liczbie 0x2321 (sprawdź ją w tabeli ascii). Gdy system widzi, że liczba magiczna, wie, że ma do czynienia ze skryptem tekstowym i czyta do następnego \n (jest limit, ale mi umyka). Po zidentyfikowaniu interpretera (pierwszego argumentu po shebang) wywoła on interpretera.

Inne pliki również mają magiczne liczby. Spróbuj spojrzeć na bitmapę (.BMP) plik poprzez less i zobaczysz dwa pierwsze znaki BM. Ta magiczna liczba oznacza, że plik jest rzeczywiście bitmapą.

 41
Author: Foo Bah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-10 15:59:50

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

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

 7
Author: Kusalananda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-05 20:55:45

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

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

 5
Author: Kevin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-09 19:58:59

#!/bin/sh or #!/bin/bash musi być pierwszą linią skryptu, ponieważ jeśli nie użyjesz go w pierwszej linii, system potraktuje wszystkie polecenia w tym skrypcie jako różne polecenia. Jeśli pierwsza linia to #!/bin/sh, to wszystkie polecenia będą traktowane jako jeden skrypt i pokażą, że ten plik jest uruchomiony w Komendzie ps, a nie w Komendzie 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
 -3
Author: Sarvesh Pawar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-05 05:32:19