No es necesariamente mejor.
La ventaja de esto #!/usr/bin/env pythones que usará cualquier pythonejecutable que aparezca primero en el usuario $PATH.
La desventaja de #!/usr/bin/env pythones que va a utilizar cualquier pythonejecutable 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/pythonque se instaló con el sistema operativo. Por otro lado, podría usar un experimental /home/phred/bin/pythonque no funciona correctamente.
Y si pythonsólo se instala en /usr/local/bin, un usuario que no tiene /usr/local/binen $PATHni 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/envtruco 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/envtruco es posiblemente un abuso del envcomando, 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 envcomando /usr/bin. Es probable que ninguno de estos sea una preocupación importante. envfunciona de esta manera, muchos scripts utilizan el #!/usr/bin/envtruco, 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, $PATHes 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 $PATHshell predeterminado de usuario, entonces el /usr/bin/envtruco no funcionará. Puede especificar la ruta exacta, o puede agregar una línea a su crontab para establecer $PATH( man 5 crontabpara más detalles).