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/sh
al principio?
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/sh
al principio?
Respuestas:
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/whatever
parte, que de lo contrario podría ser un error de sintaxis en ese idioma en particular.
exec()
llamada del sistema en el archivo.
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 less
y verá que los dos primeros caracteres son BM
. Este número mágico denota que el archivo es de hecho un mapa de bits.
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.
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.).
#!/bin/sh
o #!/bin/bash
tiene 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/sh
entonces, considerará todos los comandos como un script y mostrará que este archivo se está ejecutando en ps
comando 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
ps
, y los extractos de código como #!/bin/sh
deberían formatearse.