¿Qué significa la línea "#! / Bin / sh" en un script de shell de UNIX?

142

Estaba revisando algunos tutoriales de script de shell y encontré el siguiente programa de muestra:

#!/bin/sh
clear
echo "HELLO WORLD"

¿Alguien puede decirme cuál es la importancia del comentario #!/bin/shal principio?

Jake
fuente

Respuestas:

143

Se llama shebang y le dice al shell principal qué intérprete se debe usar para ejecutar el script.

p.ej

#!/usr/bin/perl   <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

Se implementa como un comentario para que cualquier cosa que entre en esa línea no sea "relevante" para el intérprete especificado. Por ejemplo, todos los lenguajes de secuencias de comandos tienden a comprender que una línea que comienza con #un comentario e ignorará la !/usr/bin/whateverparte, que de lo contrario podría ser un error de sintaxis en ese idioma en particular.

Marc B
fuente
66
Por lo general, es el núcleo, no el shell, el que procesa esto. El shell simplemente llama a la exec()llamada del sistema en el archivo.
tripleee
47

Cuando intenta ejecutar un programa en Unix (uno con el conjunto de bits ejecutable), el sistema operativo observará los primeros bytes del archivo. Estos forman el llamado "número mágico", que se puede utilizar para decidir el formato del programa y cómo ejecutarlo.

#!corresponde al número mágico 0x2321 (búsquelo en una tabla ascii). Cuando el sistema ve ese número mágico, sabe que se trata de un guión de texto y lee hasta el siguiente \n(hay un límite, pero se me escapa). Una vez identificado el intérprete (el primer argumento después del shebang) llamará al intérprete.

Otros archivos también tienen números mágicos. Intente mirar un archivo de mapa de bits (.BMP) a través de lessy verá que los dos primeros caracteres son BM. Este número mágico denota que el archivo es de hecho un mapa de bits.

Foo Bah
fuente
10

Si el archivo en el que vive este script es ejecutable, el hash-bang ( #!) le dice al sistema operativo qué intérprete usar para ejecutar el script. En este caso es /bin/sh, por ejemplo.

Hay un artículo de Wikipedia al respecto para obtener más información.

Kusalananda
fuente
5

La primera línea le dice al shell que si ejecuta el script directamente (./run.sh; a diferencia de / bin / sh run.sh), debería usar ese programa (/ bin / sh en este caso) para interpretarlo.

También puede usarlo para pasar argumentos, comúnmente -e (salir en caso de error), o usar otros programas (/ bin / awk, / usr / bin / perl, etc.).

Kevin
fuente
-4

#!/bin/sho #!/bin/bashtiene que ser la primera línea del script porque si no lo usa en la primera línea, el sistema tratará todos los comandos en ese script como comandos diferentes. Si la primera línea es #!/bin/shentonces, considerará todos los comandos como un script y mostrará que este archivo se está ejecutando en pscomando y no los comandos dentro del archivo.

./echo.sh

ps -ef |grep echo
trainee   3036  2717  0 16:24 pts/0    00:00:00 /bin/sh ./echo.sh
root      3042  2912  0 16:24 pts/1    00:00:00 grep --color=auto echo
Sarvesh Pawar
fuente
1
Stack Overflow no es Twitter. Tómese el tiempo para deletrear palabras como "u" y "1st". Estás ayudando a escribir un libro de referencia para que la gramática y la ortografía sean significativas. Además, preste atención al formato adecuado. Los comandos que se emitirían desde la línea de comandos, como ps, y los extractos de código como #!/bin/shdeberían formatearse.
The Tin Man
Traté de limpiar el inglés aquí, pero todavía no estoy seguro de lo que significa. Supongo que la respuesta intenta decir que los comandos en el script se ejecutarán como comandos distintos y agregar un shebang mostrará el script como un solo comando en una lista de procesos. Esto no es realmente cierto.
tripleee