2013-05-13 14 views
6

Przykład jedenSkutki komentarza (#) linie przed i/lub po komentarzu podobny #!/Bin/linia sh

#!/bin/sh 
# purpose: print out current directory name and contents 
pwd 
ls 

Przykład dwa

# purpose: print out current directory name and contents 
#!/bin/sh 
pwd 
ls 

Co jest różnica - jeśli zrobię pierwszy wiersz komentarzem (#), z #!/bin/sh jako drugą linią, co się stanie?

Co to jest oznaczenie #!/bin/sh?

+0

Byłoby łatwiej, jeśli otoczyłeś skrypty znacznikami kodu. Nieregularna czcionka sprawia, że ​​jest to naprawdę mylące ... – user1581900

+0

#!/Bin/sh określa ścieżkę do powłoki, która powinna być użyta w skrypcie. Na podobne pytanie udzielono odpowiedzi: http: // stackoverflow.com/questions/8967902/why-do-you-need-to-put-bin-bash-at-the-beginning-of-a-script-file – user1581900

+2

możliwy duplikat ... http: //stackoverflow.com/questions/7366775/what-does-the-line-bin-sh-mean-in-a-unix-shell-script – Peeyush

Odpowiedz

2

Zazwyczaj skrypt powłoki jest uruchamiany przez domyślną powłokę zdefiniowaną w pliku/etc/passwd. Ale możesz zdefiniować jawnie program, który może uruchomić twój skrypt.

Unice używa wspólnej metody ustalania programu potrzebnego do uruchomienia określonego skryptu (man execve(2)). Jeśli skrypt ma ustawione odpowiednie prawa wykonywania, aw skrypcie pierwsza linia zaczyna się od znaków #!, zostanie uruchomiona przez program zdefiniowany później.

Na przykład, jeśli pierwsza linia to #!/usr/bin/awk -f, wówczas reszta pliku zostanie przekazana do programu awk (więc musi użyć składni awk). Lub jeśli Makefile zaczyna się od #!/usr/bin/make -f, wówczas reszta pliku zostanie przekazana do make. Możesz uruchomić skrypt jako normalny program, a skrypt można zapisać w postaci składni awk lub make (lub innej).

Jeśli execve nie znajdzie #! jako dwóch pierwszych znaków pliku, potraktuje to jako zwykły plik skryptu i będzie działać tak jak jest.

Używanie #! Możesz określić język skryptowy i nie musisz wiedzieć, z której powłoki korzysta inny użytkownik, używając Twojego skryptu. W każdym innym wierszu #! zostanie zinterpretowana domyślna powłoka, która zwykle jest po prostu linią komentarza.

+0

jeśli daję komentarz (#) w 1. wierszu po #!/Bin/sh w drugiej linii, więc co się stanie? – Manikanta

+0

@Manikanta: To jest linia komentarza w 'sh', więc zostanie pominięta. Na maszynie linuksowej 'ls -l/bin/sh' jest dowiązaniem symbolicznym do basha. – TrueY

+0

@TrueY '/ bin/sh' zdecydowanie nie jest łączem do' bash' na wszystkich systemach Linux, np. Systemy oparte na Debianie już dawno zostały przełączone na 'dash'. Ponadto to nie powłoka szuka "#!", Jądro to robi. –

1

Czym różnią się skrypty 2. powłoki od 1.& ..?

Brak różnic w wydajności. Ale czas wykonania obu będzie trochę inny, ponieważ tłumacz czyta wiersz po kolei.

jeśli podaję komentarz (#) w 1. wierszu po #!/Bin/sh w drugiej linii, więc co się stanie?

Każda linia rozpoczynająca się od (#) oprócz shebang (#!) Jest traktowana jako komentarz w skrypcie powłoki.

co to jest #!/Bin/sh?

Jest to ścieżka (tutaj -/bin/sh) do tłumacza używanego po shebangu (#!). Shell spróbuje użyć języka interpretera wspomnianego po shebangu do wykonania skryptu.

+2

To nie jest do końca poprawne. W zależności od powłoki, która zostanie wykonana w przypadku brakującego shebangu, dane wyjściowe mogą się różnić w zależności od funkcji danej powłoki (nie w przypadku tego fragmentu, ale w każdym rzeczywistym przypadku). Zazwyczaj nie czytają oni skryptu wiersz po wierszu, czytają blokowo. –

+0

Czy możesz skomentować, czy linia półświatka jest honorowana w drugim przykładzie? Innymi słowy, czy wymagane jest, aby jeśli chcesz mieć shebang, to ** musi być pierwszą rzeczą w twoim pliku? Żadne inne komentarze nie mogą nadejść przed nim? – FGreg

Powiązane problemy