2013-07-03 20 views

Odpowiedz

12

Linia shebang jest opcjonalny i jeśli uruchomić interpreter Ruby i przekazać skrypt to jako argument wiersza poleceń, wtedy flagi ustawione w wierszu poleceń są flagami z rubinami.

Linia Shebang wcale nie jest rubinem (chyba, że ​​chcesz ją nazwać rubinowym komentarzem). To naprawdę skrypty powłoki. Większość użytkowników Linuksa i Uniksa uruchamia powłokę BASH (oznacza Borne Again SHell), ale prawie każdy system operacyjny ma interpreter poleceń, który będzie honorował Shebanga.

„#!/Usr/local/bin/Ruby -w”

"ona" część jest octothorp (#), aka krzyżyka, numer znaku, znaku hash, a teraz tagu hash (I nadal nazywają to Tic-Tac-Toe tylko bo).

Część "bang" to znak wykrzyknika (!) I to tak, jakby walić pięścią w stół, aby wykrzyczeć polecenie.

W systemie Windows "Shell" jest wierszem polecenia, ale nawet bez czarnego okna DOS, interpreter poleceń uruchomi skrypt na podstawie skojarzeń plików. Nie ma znaczenia, czy interpreter poleceń lub program langue czytają shebang i upewnia się, że flagi są honorowane, ważne jest to, że są honorowane.

"-w" jest flagą. Zasadniczo jest to instrukcja do śledzenia ruby ​​podczas uruchamiania skryptu.W tym przypadku "-w" włącza ostrzeżenia, więc otrzymasz dodatkowe ostrzeżenia (skrypt nadal działa) lub błędy (skrypt przestanie działać) podczas wykonywania skryptu. Ostrzeżenia i wyjątki mogą zostać przechwycone i wykorzystane w trakcie programu. Pomagają one programistom znaleźć problemy, które prowadzą do nieoczekiwanego zachowania.

Jestem fanem szybkich i brudnych scenariuszy, aby wykonać pracę, więc nie -w. Jestem także fanem wysokiej jakości kodów wielokrotnego użytku, więc zdecydowanie używaj -w. Właściwe narzędzie do właściwej pracy. Jeśli się uczysz, zawsze używaj -w. Kiedy wiesz, co robisz i przestajesz używać -w przy szybkich zadaniach, zaczniesz się zastanawiać, kiedy to pomogłoby w użyciu - zamiast spędzać wiele godzin na rozwiązywaniu problemów. (Podpowiedź, gdy przyczyna problemu nie jest dość oczywista, wystarczy dodać -w i uruchomić go, aby zobaczyć, co otrzymasz).

"-w" wymaga dodatkowego kodowania, aby było jasne, co masz na myśli, więc nie od razu rozwiązuje problem, ale jeśli już piszesz kod z -w, nie będziesz miał problemu z dodawaniem niezbędne elementy, aby mały skrypt działał z ostrzeżeniami. W rzeczywistości, jeśli jesteś przyzwyczajony do używania -w, prawdopodobnie już piszesz ten kod i -w niczego nie zmieni, chyba że coś zapomnisz. Ruby wymaga znacznie mniej "kodu instalacyjnego" niż większość (być może wszystkie) języków kompilowanych, takich jak C++, więc nie używając -w nie pozwala na zapisanie dużej ilości tekstu, po prostu pozwala mniej myśleć, zanim spróbujesz uruchomić skrypt (IMHO).

-v jest trybem pełnym i NIE zmienia działania skryptu (nie są zgłaszane żadne ostrzeżenia, nie zatrzymuje się skrypt w nowych miejscach). Kilka serwisów i dyskusji wywołuje tryb -w verbose, ale -w jest trybem ostrzegawczym i zmienia wykonanie skryptu.

+0

Dziękujemy za szczegółowe wyjaśnienie flagi '-w'! – lacostenycoder

48

Nazywa się Shebang. Informuje program ładujący, jaką komendę użyć do wykonania pliku. Tak więc po uruchomieniu ./myscript.rb, faktycznie tłumaczy się na /usr/local/bin/ruby -w ./myscript.rb.

System Windows używa skojarzeń plików dla tego samego celu; linia shebang nie ma żadnego efektu (edytuj: patrz odpowiedź FMc), ale nie powoduje też szkody.

przenośny sposób (praca, powiedzmy, pod Cygwin i RVM) byłoby:

#!/usr/bin/env ruby 

ten użyje komendy env aby dowiedzieć się, gdzie znajduje się interpreter Ruby i uruchomić go.

Edytuj: najwyraźniej, dokładnie Cygwin będzie źle się zachowywał z /usr/bin/env ruby -w i spróbuje wyszukać ruby -w zamiast ruby. Możesz umieścić efekt -w w samym skrypcie.

+0

Myślę, że -w odnosi się do włączania trybu szczegółowego lub po prostu włączania raportowania błędów. Ponieważ #!/Usr/local/bin/ruby ​​-w nie ma sensu dla okien, dla asocjacji plików musimy dodać jakieś oświadczenie na początku programu? – simminni

+0

W systemie Windows po prostu kojarz pliki '.rb' z plikiem wykonywalnym Ruby, gdziekolwiek on jest. – Koterpillar

+0

dziękuję za wyjaśnienie moich wątpliwości. – simminni

8

Mimo że zachowanie wykonywania linii shebang nie przekłada się bezpośrednio na świat systemu Windows, flagi uwzględnione w tym wierszu (na przykład -w w pytaniu) mają wpływ na działający skrypt Ruby.

Przykład 1 na komputerze z systemem Windows:

#!/usr/local/bin/ruby -w 
puts $VERBOSE # true 

przykładu 2 na komputerze z systemem Windows:

+2

Nie jestem pewien, czy istotne jest, aby zapytać o to tutaj, ale czy możesz mi powiedzieć, jaka jest rola zmiennej globalnej VERBOSE? – simminni

+1

@simminni Jeśli uruchomisz 'ruby -h' otrzymasz podstawową (ale niezbyt pomocną) odpowiedź: flaga' -w' będzie "włączać ostrzeżenia o twoim skrypcie". Zobacz ten post na nieco więcej kontekstu: http://mislav.uniqpath.com/2011/06/ruby-verbose-mode. Moja rada: jeśli twój skrypt zależy od '$ VERBOSE' o określonej wartości, ustaw go jawnie w skrypcie (nie polegaj na flagach linii Shebang). – FMc