Non è necessariamente migliore.
Il vantaggio #!/usr/bin/env python
è che utilizzerà qualunque python
eseguibile appare per primo nell'utente $PATH
.
Lo svantaggio di #!/usr/bin/env python
è che utilizzerà qualunque python
eseguibile appare per primo nell'utente $PATH
.
Ciò significa che lo script potrebbe comportarsi diversamente a seconda di chi lo esegue. Per un utente, potrebbe utilizzare /usr/bin/python
quello installato con il sistema operativo. Per un altro, potrebbe usare un esperimento /home/phred/bin/python
che non funziona correttamente.
E se python
è installato solo in /usr/local/bin
, un utente che non ha /usr/local/bin
in $PATH
non sarà nemmeno in grado di eseguire lo script. (Probabilmente non è troppo probabile sui sistemi moderni, ma potrebbe facilmente accadere per un interprete più oscuro.)
Specificando #!/usr/bin/python
si specifica esattamente quale interprete verrà utilizzato per eseguire lo script su un determinato sistema .
Un altro potenziale problema è che il #!/usr/bin/env
trucco non consente di passare argomenti all'intreprete (diverso dal nome dello script, che viene passato implicitamente). Questo di solito non è un problema, ma può esserlo. Molti script Perl sono scritti con #!/usr/bin/perl -w
, ma use warnings;
è la sostituzione consigliata in questi giorni. Gli script Csh dovrebbero usare #!/bin/csh -f
- ma gli script csh non sono consigliati in primo luogo. Ma potrebbero esserci altri esempi.
Ho un numero di script Perl in un sistema di controllo del codice sorgente personale che installo quando installo un account su un nuovo sistema. Uso uno script di installazione che modifica la #!
riga di ogni script man mano che lo installa nel mio $HOME/bin
. (Non ho dovuto usare altro che negli #!/usr/bin/perl
ultimi tempi; risale ai tempi in cui Perl spesso non era installato di default.)
Un punto secondario: il #!/usr/bin/env
trucco è probabilmente un abuso del env
comando, che originariamente era inteso (come suggerisce il nome) per invocare un comando con un ambiente alterato. Inoltre, alcuni sistemi meno recenti (incluso SunOS 4, se ricordo bene) non avevano il env
comando /usr/bin
. Nessuno di questi è probabilmente una preoccupazione significativa. env
funziona in questo modo, molti script usano il #!/usr/bin/env
trucco e è probabile che i provider di sistemi operativi non facciano nulla per romperlo. Si potrebbe essere un problema se si desidera che lo script per l'esecuzione su un sistema molto vecchio, ma allora è molto probabile che la necessità di modificare lo stesso.
Un altro possibile problema (grazie a Sopalajo de Arrierez per averlo sottolineato nei commenti) è che i lavori cron vengono eseguiti con un ambiente limitato. In particolare, $PATH
è in genere qualcosa di simile /usr/bin:/bin
. Quindi se la directory che contiene l'interprete non si trova in una di quelle directory, anche se è nella tua impostazione predefinita $PATH
in una shell utente, il /usr/bin/env
trucco non funzionerà. Puoi specificare il percorso esatto oppure puoi aggiungere una linea al tuo crontab da impostare $PATH
( man 5 crontab
per i dettagli).