jaki jest pożytek z "#!/usr/local/bin / ruby-w" na początku programu ruby

Jaki jest sens pisania następującego polecenia na początku programu ruby ?

#!/usr/local/bin/ruby -w

Czy jest to polecenie specyficzne dla systemu operacyjnego? Czy jest on ważny dla ruby w systemie windows ? jeśli nie, to jakie jest równoważne polecenie w systemie windows ?

Author: Arup Rakshit, 2013-07-03

3 answers

Linia Shebang jest opcjonalna, a jeśli uruchomisz interpreter ruby i przekażesz do niego skrypt jako argument wiersza poleceń, to flagi ustawione w wierszu poleceń są flagami, z którymi uruchamia się ruby.

Linia Shebang w ogóle nie jest ruby (chyba że chcesz nazwać ją komentarzem ruby). To naprawdę shell scripting. Większość użytkowników Linuksa i Uniksa korzysta z powłoki BASH (skrót od Borne Again SHell), ale prawie każdy system operacyjny ma interpreter poleceń, który będzie honorował Ona.

"#!/usr / local/bin / ruby-w "

Część "ona" to oktotorp ( # ), aka znak funta, znak cyfry, znak hash, a teraz hash tag (nadal nazywam to tic-tac-toe po prostu cuz).

Część "bang" to znak wykrzyknika (!), i to jest jak Walenie pięścią w stół, aby wykrzyknąć polecenie.

W systemie Windows" powłoka " jest wierszem polecenia, ale nawet bez czarnego okna DOS, interpreter poleceń uruchomi skrypt w oparciu o skojarzenia plików. Nie ma naprawdę ma znaczenie, czy interpreter poleceń lub język programowania czyta shebang i upewnia się, że flagi są honorowane, ważne jest, że są honorowane.

" - w " jest flagą. Zasadniczo jest to instrukcja do wykonania przez ruby podczas uruchamiania skryptu. W tym przypadku "- w " włącza ostrzeżenia, więc otrzymasz dodatkowe Ostrzeżenia (skrypt działa) lub błędy (skrypt przestaje działać) podczas wykonywania skryptu. Ostrzeżenia i wyjątki mogą być wyłapywane i stosowane podczas program. Pomagają one programistom znaleźć problemy, które prowadzą do nieoczekiwanego zachowania.

Jestem fanem szybkich i brudnych skryptów, aby wykonać zadanie, więc nie -w. jestem również fanem wysokiej jakości kodowania wielokrotnego użytku, więc zdecydowanie używaj -w. odpowiedniego narzędzia do właściwej pracy. Jeśli się uczysz, to Zawsze używaj -W. kiedy wiesz, co robisz i przestaniesz używać-w do szybkich zadań, zaczniesz zastanawiać się, kiedy pomogłoby użycie-w zamiast spędzać godziny na rozwiązywaniu problemów. (Podpowiedź, gdy przyczyna problemu nie jest dość oczywiste, wystarczy dodać -w i uruchomić go, aby zobaczyć, co masz).

"-W " wymaga dodatkowego kodowania, aby wyjaśnić rubiemu, co masz na myśli, więc nie rozwiązuje to od razu rzeczy, ale jeśli już piszesz kod za pomocą-w, nie będziesz miał większych problemów z dodaniem niezbędnych bitów, aby uruchomić mały skrypt z ostrzeżeniami. W rzeczywistości, jeśli jesteś przyzwyczajony do używania-w, prawdopodobnie już piszesz kod w ten sposób i -w niczego nie zmieni, chyba że o czymś zapomnisz. Ruby wymaga o wiele mniej "kodu" niż większość (może wszystkie) skompilowanych języków, takich jak C++, więc rezygnacja z-w nie pozwala na zaoszczędzenie dużo pisania, po prostu pozwala mniej myśleć, zanim spróbujesz uruchomić skrypt (IMHO).

- v jest trybem verbose i nie zmienia działania skryptu (nie pojawiają się ostrzeżenia, nie zatrzymują skryptu w nowych miejscach). Kilka stron i dyskusji wywołuje-w tryb zwrotny, ale -w jest trybem ostrzegawczym i zmienia wykonanie skryptu.

 31
Author: Able Mac,
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-19 06:12:54

Nazywa sięShebang . Mówi programowi ładującemu jakie polecenie użyć do wykonania pliku. Więc kiedy biegniesz ./myscript.rb, to faktycznie przekłada się na /usr/local/bin/ruby -w ./myscript.rb.

Windows używa skojarzeń plików do tego samego celu; linia shebang nie ma żadnego efektu (edit: zobacz odpowiedź FMc), ale nie powoduje żadnej szkody.

Przenośnym sposobem (działającym np. pod Cygwinem i RVM ) byłoby:

#!/usr/bin/env ruby

To użyje ENV aby dowiedzieć się, gdzie znajduje się Ruby interpreter jest i uruchom go.

Edit: najwyraźniej właśnie Cygwin źle się zachowuje z /usr/bin/env ruby -w i próbuje szukać ruby -w zamiast ruby. Możesz chcieć umieścić efekt -w w samym skrypcie.

 68
Author: Koterpillar,
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-07-03 22:10:22

Chociaż zachowanie wykonania linii shebang nie przekłada się bezpośrednio na świat Windows, flagi zawarte w tej linii (na przykład -w w twoim pytaniu) wpływają na uruchomiony skrypt Ruby.

Przykład 1 na komputerze z systemem Windows:

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

Przykład 2 na komputerze z systemem Windows:

#!/usr/local/bin/ruby
puts $VERBOSE   # false
 10
Author: FMc,
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
2014-05-02 22:25:00