bash - shebang meaning
¿Cuál es el Bash Shebang preferido? (5)
Debe usar #!/usr/bin/env bash
para la portability : diferentes * nixes ponen bash
en diferentes lugares, y usar /usr/bin/env
es una solución para ejecutar el primer bash
encuentra en el PATH
. Y sh
no es bash
.
¿Hay Bash
shebang objetivamente mejor que los otros para la mayoría de los usos?
-
#!/usr/bin/env bash
-
#!/bin/bash
-
#!/bin/sh
-
#!/bin/sh -
- etc
Recuerdo vagamente que hace mucho tiempo escuché que agregar un guión al final impide que alguien pase un comando a su script, pero no puede encontrar ningún detalle al respecto.
El uso de una línea shebang para invocar al intérprete apropiado no es solo para BASH. Puede usar el shebang para cualquier lenguaje interpretado en su sistema, como Perl, Python, PHP (CLI) y muchos otros. Por cierto, el shebang
#!/bin/sh -
(también puede ser dos guiones, es decir, --
) finaliza las opciones de bash, todo lo que se tratará después como nombres de archivo y argumentos.
El uso del comando env
hace que su script sea portátil y le permite configurar entornos personalizados para su script, por lo tanto, los scripts portátiles deberían usar
#!/usr/bin/env bash
O para cualquiera que sea el idioma como Perl
#!/usr/bin/env perl
Asegúrate de mirar las páginas man
para bash
:
man bash
y env
:
man env
Nota: En los sistemas basados en Debian y Debian, como Ubuntu, sh
está vinculado a dash
no bash
. Como todos los scripts del sistema usan sh
. Esto permite que bash crezca y que el sistema se mantenga estable, según Debian.
Además, para mantener la invocación * nix como nunca uso extensiones de archivo en los scripts invocados shebang, ya que no puede omitir la extensión en la invocación en ejecutables como puede hacerlo en Windows. El comando de archivo puede identificarlo como un script.
Realmente depende de cómo escribas tus scripts de bash. Si su /bin/sh
tiene un enlace simbólico a bash, cuando se invoca a bash como sh
, algunas funciones no están disponibles .
Si desea funciones específicas de bash que no sean POSIX, use #!/bin/bash
Recomiendo usar:
#!/bin/bash
No es 100% portátil (algunos sistemas colocan a bash
en una ubicación que no sea /bin
), pero el hecho de que muchos scripts existentes usan #!/bin/bash
presiona a varios sistemas operativos para hacer que /bin/bash
al menos un enlace simbólico para La ubicación principal.
La alternativa de:
#!/usr/bin/env bash
se ha sugerido, pero no hay garantía de que el comando env
esté en /usr/bin
(y he usado sistemas donde no lo está). Además, este formulario utilizará la primera instancia de bash
en el usuario actual $PATH
, que podría no ser una versión adecuada del shell bash.
Si necesita una secuencia de comandos para ejecutarse en un sistema que no tiene /bin/bash
, puede modificar la secuencia de comandos para que apunte a la ubicación correcta (eso es ciertamente inconveniente).
He discutido las compensaciones en mayor profundidad en mi respuesta a esta pregunta .
/bin/sh
suele ser un enlace a la shell predeterminada del sistema, que a menudo es bash
pero en, por ejemplo, los sistemas Debian es el dash
menor peso. De cualquier manera, el shell original de Bourne es sh
, por lo tanto, si su secuencia de comandos usa algunas características específicas de bash
(2a generación, "Bourne Again sh") ( [[ ]]
, arreglos, varias cosas azucaradas, etc.), debería estar Más específico y uso posterior. De esta manera, en los sistemas donde no está instalado bash, su script no se ejecutará. Entiendo que puede haber una trilogía emocionante de películas sobre esta evolución ... pero eso podría ser un rumor.
También tenga en cuenta que cuando se evoca como sh
, bash
comporta en cierta medida como sh
estándar POSIX (consulte también la documentación de GNU acerca de esto).