read - ¿Qué significa la línea "#!/Bin/sh" en un script de shell de UNIX?
shell ask for input (5)
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úscalo en una tabla ascii). Cuando el sistema ve ese número mágico, sabe que se trata de un script de texto y lo lee hasta el próximo /n
(hay un límite, pero me escapa atm). Después de haber identificado al 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.
Estaba repasando algunos tutoriales de script de shell y encontré el siguiente programa de ejemplo:
#!/bin/sh
clear
echo "HELLO WORLD"
¿Alguien puede decir cuál es la importancia de mencionar '' !/bin/sh
'' en el comentario?
La primera línea le dice al shell que si ejecuta el script directamente (./run.sh, en lugar 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 por error), o usar otros programas (/ bin / awk, / usr / bin / perl, etc.).
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 todo lo que se encuentre en esa línea no sea "relevante" para el intérprete especificado. por ejemplo, todos los lenguajes de scripting tienden a entender que una línea que comienza con #
es un comentario e ignorará la porción !/usr/bin/whatever
, que de lo contrario podría ser un error de sintaxis en ese idioma en particular.
Si el archivo en el que se encuentra esta secuencia de comandos es ejecutable, hash-bang ( #!
) Le dice al sistema operativo qué intérprete usar para ejecutar la secuencia de comandos. En este caso es /bin/sh
, por ejemplo.
Hay un Shebang respecto para más información.
#!/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
, considerará todos los comandos como un único script y mostrará que este archivo se ejecuta en el comando ps
y no en 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