2011-09-30 12 views
8

Ovviamente questo si applica ugualmente a python, bash, sh, ecc sostituiti con perl!Durante lo scripting, qual è la differenza tra #!/Usr/bin/perl e #!/Usr/bin/env perl?

La risposta di Quentin in basso era chiaramente corretta, e così l'ho accettata, ma immagino che in realtà intendevo dire "quali sono i pro ei contro dei due modi di usare #! invocare perl/python/bash come interprete di uno script? '

+0

Questa domanda in realtà non hanno nulla a che fare con specifici linguaggi di scripting, ma ho lasciato taggato perl perché questo è l'esempio utilizzato nel titolo. – agf

risposta

9

Un riferimento a un luogo comune che perl è installato. L'altro fa riferimento a un luogo comune in cui env è installato e chiede quale sia il percorso del perl predefinito.

3

L'utilizzo di env per trovare l'eseguibile, piuttosto che trovarlo, esegue un exec aggiuntivo, ma ciò non dovrebbe avere importanza per la maggior parte del tempo. È comodo e spesso lo uso da solo.

Tuttavia, ho riscontrato problemi con le persone che utilizzano env negli script di sistema. On one occasion, l'installazione di /usr/local/bin/perl ha interrotto il sistema in modo che non potessi più aggiornarlo finché non ho risolto il problema. On another occasion, l'installazione di un /usr/local/bin/python ha rotto il tagger ID3 che stavo usando. Penso che questo sia più un problema di packaging che un problema inerente a env. Se stai installando qualcosa su un sistema, perché stai controllando attentamente che abbia una versione di Python che soddisfi tutte le tue dipendenze se stai per lasciare una linea shebang che pesca ogni volta per qualsiasi vecchia versione di Python è gestito?

+0

Non vedo alcun motivo per cui 'env' dovrebbe aprire un altro processo. Intendevi "dirigenti" o, in alternativa, ti dispiacerebbe espandere l'argomento? –

+0

Sì. Post aggiornato. Grazie! – oylenshpeegul

1

posso darvi un esempio concreto:

Immaginate di avere un pacchetto LAMP installato in/opt/(vale a dire XAMPP) che include un proprio eseguibile perl, librerie e direttore pakage.

In realtà si desidera eseguire quell'eseguibile in modo da aggiungere il percorso agli eseguibili LAMP nella variabile di ambiente PATH (PATH = "/ opt/XAMPP/bin: $ PATH").

Ora qualsiasi script che utilizza "#!/Usr/bin/env perl" eseguirà il binario perl nella directory stack LAMP. L'altro percorso eseguirà il binario perl preinstallato nel sistema, in "/ usr/bin/perl".

Sta a te decidere cosa è meglio per il tuo script perl.

7

Queste sono buone regole, se avete un buon motivo per rompere loro, non esitate a farlo:

Usa #!/usr/bin/env perl ove possibile, per la portabilità tra sistemi eterogenei. Ma questo è un modo stupido per farlo perché fa supporre che il Perl che è il primo nel percorso sia anche il Perl che vuoi sempre. Potrebbe non essere così, e di solito quando ci sono molti Perls su un sistema ci sono per una certa ragione.

Un approccio migliore consiste nel pacchettizzare gli script in una distribuzione pronta per CPAN. Distribuire le distribuzioni ai sistemi in cui si desidera installarle e installarle nel modo consueto (manualmente o con la toolchain CPAN), specificando il percorso completo a perl o cpan. Durante questo processo, the shebang line is rewritten sul percorso corretto per Perl.

Esempi:

tar -xvf Local-OurCompany-Scripts-1.000.tar.gz 
cd Local-OurCompany-Scripts-1.000 

## automated installation 
/usr/bin/cpan . 
# or perhaps 
/opt/ourcompany/perls/perl-5.14.2/bin/cpan . 

## manual installation 
/usr/bin/perl Makefile.PL ; make ; make install 
# or perhaps 
`which perl5.14.2` Makefile.PL ; make ; make install 
+2

Ma dimentichi che la manipolazione del percorso è facile: usare 'env' ti permette di usare diversi perls per diversi programmi (o anche lo stesso programma in momenti diversi). Usando un percorso perl hardcoded e la capacità di riscrittura dei percorsi di CPAN si assume che il perl utilizzato per eseguire l'installazione sia il perl che si desidera sempre, il che direi è un'ipotesi più grande (e peggiore) di quella fatta da 'env', poiché richiede la modifica del sorgente per sovrascriverlo, piuttosto che un semplice "PATH =/percorso/a/altro/perl: $ PATH some_perl.pl". –

+0

Sono d'accordo con questa parte: _ "Ma questo è un modo stupido di farlo perché presuppone che il Perl che è il primo nel percorso sia anche il Perl che vuoi sempre." _ E aggiungerebbe che si presuppone che il tuo script funziona bene con qualsiasi istanza data Perl (e Perl-Modules) che trova. – Gonen

Problemi correlati