¿Por qué necesita poner #! / Bin / bash al comienzo de un archivo de script?

He hecho scripts Bash antes y todos funcionaron bien sin esto al principio. ¿De qué sirve ponerlo? ¿Las cosas serían diferentes?

Además, ¿cómo se pronuncia # ? ¡Lo sé ! se pronuncia como “bang”.

Como es #! ¿pronunciado?

Es una convención para que el shell * nix sepa qué tipo de intérprete ejecutar.

Por ejemplo, los sabores antiguos de ATT omitieron sh (el shell de Bourne), mientras que las versiones anteriores de BSD dejaron de usar csh (el shell de C).

Incluso hoy (donde la mayoría de los sistemas ejecutan bash, el “Bourne Again Shell” ), los scripts pueden estar en bash, python, perl, ruby, PHP, etc., etc. Por ejemplo, es posible que vea #!/bin/perl o #!/bin/perl5 .

PD: El signo de exclamación ( ! ) Se llama cariñosamente “bang” . El símbolo de comentario de shell ( # ) a veces se llama “hash” .

PPS: Recuerde: bajo * nix, asociar un sufijo con un tipo de archivo es simplemente una convención , no una “regla” . Un ejecutable puede ser un progtwig binario, cualquiera de un millón de tipos de script y otras cosas también. De ahí la necesidad de #!/bin/bash .

Para ser más preciso, el shebang #! , cuando se trata de los primeros dos bytes de un archivo ejecutable ( modo x ), es interpretado por la llamada al sistema execve (2) (que ejecuta progtwigs). Pero la especificación POSIX para execve no menciona el shebang.

Debe ir seguido de una ruta de archivo de un ejecutable de intérprete (que por cierto podría ser relativo, pero la mayoría de las veces es absoluta).

Un buen truco (o tal vez no tan bueno ) para encontrar un intérprete (por ejemplo, python ) en $PATH del usuario es usar el progtwig env (siempre en /usr/bin/env en todos los Linux) como, por ejemplo

  #!/usr/bin/env python 

Cualquier ejecutable ELF puede ser un intérprete. ¡Incluso podría usar #!/bin/cat o #!/bin/true si quisiera! (pero eso sería a menudo inútil)

Se llama shebang . En Unix-speak, # se llama sharp (como en la música) o hash (como hashtags en twitter), y! se llama bang. (En realidad, puede hacer referencia a su comando de shell anterior con !!, llamado bang-bang). Entonces cuando se juntan, se obtiene haSH-BANG, o shebang.

La parte después del #! le dice a Unix qué progtwig usar para ejecutarlo. Si no se especifica, intentará con bash (o sh, o zsh, o cualquiera que sea su variable $ SHELL) pero si está allí, usará ese progtwig. Además, # es un comentario en la mayoría de los idiomas, por lo que la línea se ignora en la ejecución posterior.

¡El shebang es una directiva para que el cargador use el progtwig que se especifica después del #! como el intérprete del archivo en cuestión cuando intentas ejecutarlo. Por lo tanto, si intenta ejecutar un archivo llamado foo.sh que tiene #!/bin/bash en la parte superior, el comando real que se ejecuta es /bin/bash foo.sh Esta es una forma flexible de utilizar diferentes intérpretes para diferentes progtwigs. Esto es algo implementado a nivel de sistema y la API de nivel de usuario es la convención shebang.

También vale la pena saber que el shebang es un número mágico , uno legible por humanos que identifica el archivo como un script para el intérprete dado.

Su punto de que “funciona” incluso sin el shebang es solo porque el progtwig en cuestión es un script de shell escrito para el mismo shell que el que está usando. Por ejemplo, podrías escribir un archivo javascript y luego poner un #! /usr/bin/js #! /usr/bin/js (o algo similar) para tener un “script de Shell” de javascript.

El sistema operativo toma el shell predeterminado para ejecutar su script de shell. por lo tanto, al mencionar la ruta del shell al comienzo del script, le está pidiendo al sistema operativo que use ese shell en particular. También es útil para la portabilidad .

Cada distribución tiene un shell predeterminado. Bash es el valor predeterminado en la mayoría de los sistemas. Si trabaja en un sistema que tiene un shell predeterminado diferente, es posible que los scripts no funcionen como deberían si se escriben específicamente para Bash.

Bash ha evolucionado a lo largo de los años tomando código de ksh y sh .

Agregar #!/bin/bash como la primera línea de su script, le dice al sistema operativo que invoque el shell especificado para ejecutar los comandos que siguen en el script.

#! a menudo se conoce como “hash-bang”, “she-bang” o “sha-bang”.

Se llama shebang . Consiste en un signo de número y un signo de exclamación (#!), Seguido de la ruta completa al intérprete como / bin / bash. Todos los scripts bajo UNIX y Linux se ejecutan usando el intérprete especificado en una primera línea.

Puede ser útil para alguien que usa un sistema diferente que no tiene esa biblioteca disponible. Si eso no está declarado y usted tiene algunas funciones en su script que no son compatibles con ese sistema, debe declarar # / bin / bash. Me encontré con este problema antes de trabajar y ahora solo lo incluyo como práctica.