GNU/Linux >> Tutoriales Linux >  >> Linux

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

Es una convención, por lo que *nix Shell sabe qué tipo de intérprete ejecutar.

Por ejemplo, las versiones anteriores de ATT tenían como valor predeterminado sh (el shell de Bourne), mientras que las versiones anteriores de BSD tenían como valor predeterminado csh (la capa 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 programa binario, cualquiera de un millón de tipos de secuencias de comandos y otras cosas también. De ahí la necesidad de #!/bin/bash .


Para ser más precisos, el shebang #! , cuando son los dos primeros bytes de un ejecutable (x mode), es interpretado por la llamada al sistema execve(2) (que ejecuta programas). Pero la especificación POSIX para execve no menciones el tinglado.

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

Un buen truco (o tal vez no tan bueno) para encontrar un intérprete (por ejemplo, python ) en el $PATH del usuario es usar el env programa (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ías usar #!/bin/cat o #!/bin/true ¡Si quieres! (pero eso sería a menudo inútil)


Se llama tinglado. En lenguaje Unix, # se llama sostenido (como en la música) o hash (como los hashtags en Twitter) y ! se llama explosión. (¡Puede hacer referencia a su comando de shell anterior con !!, llamado bang-bang). Entonces, cuando se juntan, obtienes haSH-BANG, o shebang.

La parte después del #! le dice a Unix qué programa 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 programa. 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.


Linux
  1. ¿Cómo maneja Linux múltiples separadores de rutas consecutivas (/home////username///file)?

  2. ¿Por qué The Bash Script no reconoce los alias?

  3. ¿Por qué una variable es visible en una subcapa?

  4. ¿Cómo verificar la subcadena en Shell Script Bash?

  5. ¿Alguna razón para tener un Shebang apuntando a /bin/sh en lugar de /bin/bash?

Ejecute el comando bash en la canalización de jenkins

cmake --version apunta a /usr/bin/cmake mientras que cmake apunta a /usr/local/bin

¿Qué tamaños debe asignar a /, /boot, /home y swap?

¿Por qué el usuario 'bin' necesita un shell de inicio de sesión?

chroot falla:no se puede ejecutar el comando '/bin/bash':no ​​existe tal archivo o directorio

#!/bin/sh vs #!/bin/bash para máxima portabilidad