2009-02-20 10 views
17

Chcę uruchomić perl -w przy użyciu env. Że działa dobrze w wierszu poleceń :Czy mogę używać przełączników perla z/bin/env w linii Shebang?

$ /bin/env perl -we 'print "Hello, world!\n"' 
Hello, world! 

Ale to nie działa na linii shebang w skrypcie:

#!/bin/env perl -w 
print "Hello, world!\n"; 

Tutaj jest błąd:

/bin/env: perl -w: No such file or directory 

Podobno env nie rozumie flagi -w, którą przechodzę pod numer perl. Co jest nie tak?

+0

Zobacz także, jak to zrobić za pomocą małego hackeryka powłoki [one] (http://stackoverflow.com/a/9051635/128583) i [two] (http://stackoverflow.com/a/3306658/128583). – Davorak

Odpowiedz

25

Hash-bang nie jest normalną linią poleceń powłoki, obsługa parsowania i obsługi przestrzeni białych jest inna - właśnie to trafiłeś. Zobacz:

Zasadniczo wiele/większość Uniksów umieścić wszystkie pozostałego tekstu po pierwszym miejscem w jeden argument.

Więc:

#!/bin/env perl -w 

jest odpowiednikiem:

/bin/env "perl -w" 

więc trzeba obsługiwać żadnych opcji do interpretera Perla w jakiś inny sposób. tj

use warnings; 

(jak @Telemachus)

15

Zamiast -w użyć pragma ostrzeżenia (dla nowoczesnych wersjach Perl):

#!/bin/env perl 
use warnings; 
use strict; 
+0

Tak, wiem o "użyciu ostrzeżeń", ale jestem przyzwyczajony do pisania "perl -w" i jestem zdezorientowany, że "env" działałby na linii poleceń, ale nie w skrypcie. – Frank

+0

"perl -w" działa na systemie Unix i jest bardziej zwięzły, ale nie działa w systemie Windows (chyba że ActivePerl lub co jawnie wyszukuje flag linii poleceń w linii Shebang), więc lepiej jest po prostu "użyć" ostrzeżenia; ". –

-1

Zapominasz katalog /usr.

+1

env może znajdować się w różnych lokalizacjach. W moim systemie znajduje się w/bin/env z miękkim łączem do/usr/bin/env. Ponieważ działa z linii poleceń, zakładam, że ma poprawną ścieżkę programu. – gpojd

+1

Byłoby bardziej przenośne używać/usr/bin/env. –

5

I że może to być przydatne, aby przywołać że "-w" nie jest taka sama jak "używać ostrzeżeń". -w będzie odnosić się do wszystkich pakietów, których używasz, "użyj ostrzeżeń" będzie stosować tylko leksykalnie. Zazwyczaj nie chcemy używać lub polegać na „-w”

2

Warto zauważyć, że Mac OS X interpretuje znaki po shebang jako argumenty, więc na OS X, co następuje zadziała:

#!/usr/bin/env perl -wT 
enter code here 

Ponieważ jednak jednym z punktów używania #!/Usr/bin/env jest wspieranie kompatybilności między platformami, najlepiej nie używać tej składni, nawet jeśli najczęściej korzystasz z komputera Mac.

Powiązane problemy