Pregunta ¿Cuál es el Shebang Bash preferido?


Hay alguna Bash shebang objetivamente mejor que los demás para la mayoría de los usos?

  • #!/usr/bin/env bash
  • #!/bin/bash
  • #!/bin/sh
  • #!/bin/sh -
  • etc

Recuerdo vagamente haber escuchado hace mucho tiempo que agregar un guion hasta el final evita que alguien le pase un comando al guión, pero no puede encontrar ningún detalle al respecto.


732
2018-04-29 21:37


origen


Respuestas:


Deberías usar #!/usr/bin/env bash para portabilidad: diferente * nixes puesto bash en diferentes lugares, y usando /usr/bin/env es una solución para ejecutar el primer bash encontrado en el PATH. Y sh no es bash.


996
2018-04-30 12:14



/bin/sh generalmente es un enlace al shell predeterminado del sistema, que muchos o la mayoría de los lugares serán/usr/bin/bash. Sin embargo, el shell Bourne original es sh, así que si tu script usa algunos bash (2ª generación, "Bourne Again sh"), entonces deberías ser más específico y usar el más tarde. De esta forma, en los sistemas donde bash no está instalado, su script no se ejecutará.

Entiendo que puede haber una emocionante trilogía de películas sobre esta evolución ... pero eso podría ser un rumor.


60
2018-04-29 21:39



Usar 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 --) termina las opciones de bash todo lo que después se tratará como nombres de archivo y argumentos.

Utilizando el env comando hace que su secuencia de comandos 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 cualquier lenguaje como Perl

#!/usr/bin/env perl

Asegúrate de mirar el man páginas 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 todas las secuencias de comandos del sistema usan sh. Esto permite que bash crezca y el sistema se mantenga estable, según Debian.

Además, para mantener invocation * nix como nunca uso extensiones de archivo en scripts invocados por shebang, no se puede omitir la extensión en la invocación en ejecutables como se puede en Windows. El comando de archivo puede identificarlo como un script.


14
2017-10-26 19:55



Realmente depende de cómo escribas tus scripts bash. Si tu /bin/sh está enlazado a bash, cuando se invoca bash sh, algunas características no están disponibles.

Si desea funciones específicas de bash, que no sean POSIX, use #!/bin/bash


1
2018-04-29 22:36