meaning bash shebang

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).