2009-02-20 9 views
17

Voglio eseguire perl -w utilizzando env. Che funziona bene sulla linea di comando :Posso usare gli switch di perl con/bin/env nella riga shebang?

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

Ma non funziona sulla linea shebang in uno script:

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

Ecco l'errore:

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

Apparentemente env non capisce il flag -w che sto passando a perl. Cosa c'è che non va?

+0

Guarda anche come farlo con un po 'di hackeraggio della shell [uno] (http://stackoverflow.com/a/9051635/128583) e [due] (http://stackoverflow.com/a/3306658/128583). – Davorak

risposta

25

L'hash-bang non è una normale riga di comando della shell, l'analisi e la gestione dello spazio bianco sono diversi: questo è ciò che hai colpito. Vedi:

Fondamentalmente molte/molti unix mettere tutto il testo rimanente dopo il primo spazio in un singolo argomento.

Quindi:

#!/bin/env perl -w 

è l'equivalente di:

/bin/env "perl -w" 

quindi è necessario gestire tutte le opzioni per l'interprete Perl in qualche altro modo. vale a dire

use warnings; 

(come @Telemachus)

15

Invece di usare la direttiva -w avvertenze (per le versioni moderne di Perl):

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

Sì, conosco "use warnings", ma sono abituato a scrivere "perl -w" e sono confuso dal fatto che "env" funzioni sulla riga di comando, ma non nello script. – Frank

+0

"perl -w" funziona su Unix, ed è più conciso, ma non funziona su Windows (a meno che ActivePerl o cosa cerchi esplicitamente per i flag della riga di comando in una riga shebang), quindi è meglio usare "solo" avvertimenti;". –

-1

Stai dimenticando la directory /usr.

+1

env può trovarsi in posizioni diverse. Sul mio sistema è in/bin/env con un collegamento software a/usr/bin/env. Dal momento che funziona dalla riga di comando, presumo che abbia il percorso corretto del programma. – gpojd

+1

Sarebbe più portatile usare/usr/bin/env. –

5

ho pensato che potrebbe essere utile per far apparire che "w" non è lo stesso di "usare le avvertenze". -w si applicherà a tutti i pacchetti che usi, "use warnings" si applicherà solo lessicalmente. In genere non si desidera utilizzare o fare affidamento su "-w"

2

Vale la pena notare che Mac OS X interpreta i caratteri dopo la faccenda come argomenti, così su OS X, il seguente funziona:

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

Tuttavia, poiché uno dei punti di utilizzo di #!/Usr/bin/env è di promuovere la compatibilità multipiattaforma, è probabilmente meglio non usare quella sintassi anche se si è principalmente su un Mac.

Problemi correlati