En los scripts, la primera línea debe especificar la ruta al intérprete.
Pero en diferentes servidores Linux, Unix o BSD, esta ruta podría ser diferente.
¿Qué es más preferible?
#!/usr/bin/env bash
o
#!/bin/bash
Si desea utilizar la versión instalada de sistema de un intérprete determinado que está instalado en una ubicación estándar, utilice la ruta directa. Si desea usar cualquier versión del intérprete que aparezca primero en el usuario $PATH
, use#!/usr/bin/env ...
.
El env
comando invoca un comando específico, lo que le permite establecer o deshabilitar variables de entorno:
env FOO=BAR do-something
env DISPLAY=:0.0 xterm -ls &
Si no especifica ninguna variable de entorno u otras opciones, solo invocará el comando con nombre. (Usarlo de esta manera es posiblemente un truco).
El propósito de escribir el shebang como
#!/usr/bin/env interp
es invocar lo que interp
aparece primero $PATH
.
Esto significa que usted no tiene que saber, al escribir el guión, exactamente donde interp
es (por ejemplo, si se pudiera estar en cualquiera /bin
, /usr/bin
o /usr/local/bin
). Por supuesto que tienes que saber que env
es/usr/bin/env
, pero parece ser razonablemente universal.
La ventaja es que invoca cualquier versión del intérprete que aparezca primero en el usuario $PATH
. La desventaja es que invoca cualquier versión del intérprete que aparece primero en el usuario $PATH
.
Por ejemplo, supongamos que he instalado una compilación personal perl
en mi directorio de inicio, como $HOME/bin/perl
, y que tengo $HOME/bin
al frente de mi $PATH
. Si ejecuto un script cuyo shebang es
#!/usr/bin/env perl
entonces se ejecutará con mi propio instalado perl
ejecutable , lo que podría no ser algo bueno. El autor del guion probablemente no lo haya probado con el perl de filo que construí desde la fuente hace un mes.
Para algo como Perl o Bash que probablemente se instale en una ubicación coherente en la mayoría de los sistemas ( /usr/bin/perl
y /bin/bash
, respectivamente), usaría la ruta directa al comando. Para algo más oscuro que podría instalarse de manera diferente en diferentes sistemas, usaría el /usr/bin/env
truco o escribiría un instalador que ajuste la línea shebang a medida que se instala el script. (Solía tener que hacer eso para mis scripts de Perl).
ACTUALIZACIÓN: He entrado un poco más en detalle en esta respuesta a esta pregunta en el sitio de Unix y Linux .
#!/usr/bin/perl
y luego usarlouse strict; use warnings;
en el cuerpo del script, en lugar de hacerlo#!/usr/bin/perl -w
. Pero-T
tiene que estar en el shebang.#!
línea no sirve$PATH
. Debe especificar la ruta del intérprete. (Me acabo de dar cuenta de que, al menos en mi sistema, puede ser una ruta relativa, pero rara vez es útil.)La mejor práctica es esta:
Y así...
Cuando Ubuntu comenzó a usar dash, algunos scripts se rompieron. Hubo una discusión al respecto. La mayoría de los guiones fueron escritos, lo
#!/bin/sh
que era un enlace a / bin / bash. El consenso es este: el guionista es responsable de especificar el intérprete. Por lo tanto, si su script siempre debe invocarse con BASH, especifíquelo desde el entorno. Esto le ahorra tener que adivinar la ruta, que es diferente en varios sistemas Unix / Linux. Además, funcionará si mañana / bin / sh se convierte en un enlace a otro shell como / bin / wthsh o alguna otra falta.fuente
#!/bin/bash
. Estoy de acuerdo en que el guionista es responsable de especificar el intérprete, pero todo lo que significa es que si necesita bash, digamos bash not shFYI, es un shee-bang
#!
, necesitas el#
. Utiliza esta línea para identificar con qué intérprete ejecutar el script.Por defecto, Ubuntu enlaza
/bin/sh
al tableroDependiendo de cuánto le gustaría saber sobre el tablero y por qué se usa el tablero para el sistema o las cubiertas de demonio, consulte:
cyberciti.biz dash
Ubuntu man man page
Bash es el shell predeterminado utilizado por la mayoría de los usuarios de Linux, y tiene diferentes características que el guión. Un script escrito para bash puede o no ejecutarse correctamente si se ejecuta con guión, cuanto más complejo sea el script, menos probable será que se ejecute.
El script escrito para perl, python, etc. no se ejecutará en absoluto con
/bin/sh
o/bin/bash
.Entonces, cuando escribe un guión, identifica qué intérprete se debe usar con el shee-bang
La selección de qué usar es hecha por el autor del guión, y uno no es mejor que otro, todos tienen varias características, ventajas y desventajas.
fuente