No es necesariamente mejor.
La ventaja de esto #!/usr/bin/env python
es que usará cualquier python
ejecutable que aparezca primero en el usuario $PATH
.
La desventaja de #!/usr/bin/env python
es que va a utilizar cualquier python
ejecutable aparece por primera vez en el usuario de $PATH
.
Eso significa que el script podría comportarse de manera diferente dependiendo de quién lo ejecute. Para un usuario, podría usar el /usr/bin/python
que se instaló con el sistema operativo. Por otro lado, podría usar un experimental /home/phred/bin/python
que no funciona correctamente.
Y si python
sólo se instala en /usr/local/bin
, un usuario que no tiene /usr/local/bin
en $PATH
ni siquiera será capaz de ejecutar el script. (Eso probablemente no sea muy probable en los sistemas modernos, pero podría suceder fácilmente para un intérprete más oscuro).
Al especificar #!/usr/bin/python
, especifica exactamente qué intérprete se utilizará para ejecutar el script en un sistema en particular .
Otro problema potencial es que el #!/usr/bin/env
truco no le permite pasar argumentos al intérprete (aparte del nombre del script, que se pasa implícitamente). Esto generalmente no es un problema, pero puede serlo. Muchos scripts de Perl están escritos con #!/usr/bin/perl -w
, pero use warnings;
es el reemplazo recomendado en estos días. Los scripts Csh deberían usar #!/bin/csh -f
, pero los scripts csh no se recomiendan en primer lugar. Pero podría haber otros ejemplos.
Tengo varias secuencias de comandos Perl en un sistema de control de fuente personal que instalo cuando configuro una cuenta en un nuevo sistema. Utilizo un script de instalador que modifica la #!
línea de cada script a medida que lo instala en mi $HOME/bin
. (No he tenido que usar nada más que #!/usr/bin/perl
últimamente; se remonta a los tiempos en que Perl a menudo no se instalaba de manera predeterminada).
Un punto menor: el #!/usr/bin/env
truco es posiblemente un abuso del env
comando, que originalmente tenía la intención (como su nombre lo indica) de invocar un comando con un entorno alterado. Además, algunos sistemas más antiguos (incluido SunOS 4, si no recuerdo mal) no tenían el env
comando /usr/bin
. Es probable que ninguno de estos sea una preocupación importante. env
funciona de esta manera, muchos scripts utilizan el #!/usr/bin/env
truco, y es probable que los proveedores de sistemas operativos no hagan nada para romperlo. Que podría ser un problema si usted quiere que su secuencia de comandos para ejecutar en un sistema muy viejo, pero entonces es muy probable que tenga que modificar todos modos.
Otro posible problema, (gracias a Sopalajo de Arrierez por señalarlo en los comentarios) es que los trabajos cron se ejecutan con un entorno restringido. En particular, $PATH
es típicamente algo así /usr/bin:/bin
. Entonces, si el directorio que contiene el intérprete no se encuentra en uno de esos directorios, incluso si está en su $PATH
shell predeterminado de usuario, entonces el /usr/bin/env
truco no funcionará. Puede especificar la ruta exacta, o puede agregar una línea a su crontab para establecer $PATH
( man 5 crontab
para más detalles).