2011-09-09 28 views
109

yo estaba pasando por algunas clases particulares de secuencias de comandos shell y encontré el siguiente programa de ejemplo:¿Qué significa la línea "#!/Bin/sh" en un script de shell de UNIX?

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

Puede alguien por favor díganos cuál es el significado de mencionar '!/bin/sh' en el comentario?

+1

[Shebang] (http://en.wikipedia.org/wiki/Shebang_%28Unix%29) – drootang

+1

Buena explicación sobre askubuntu: http://askubuntu.com/questions/141928/what-is- difference-between-bin-sh-and-bin-bash –

+1

Posible duplicado de [¿Por qué necesita poner #!/bin/bash al comienzo de un archivo de script?] (http://stackoverflow.com/questions/8967902/why-do-you-need-to-put-bin-bash-at-the-beginning-of-a-script-file) –

Respuesta

110

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 aparezca en esa línea no sea "relevante" para el intérprete especificado. p.ej. todos los lenguajes de scripting tienden a entender que una línea que comienza con # es un comentario e ignorará la parte !/usr/bin/whatever, que de lo contrario podría ser un error de sintaxis en ese idioma en particular.

+3

Por lo general, es el kernel, no el shell, el que procesa esto. El shell simplemente llama a la llamada al sistema 'exec()' en el archivo. – tripleee

7

Si el archivo en el que reside 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 Wikipedia article para obtener más información.

5

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) interpretarlo

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

41

Cuando intenta ejecutar un programa en Unix (uno con el conjunto de bits ejecutables), 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 siguiente \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 del less y verá que los primeros dos caracteres son BM. Este número mágico denota que el archivo es de hecho un mapa de bits.

-3

#!/bin/sh o #!/bin/bash tiene que ser la primera línea del script porque si no lo usa en la primera línea, entonces 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 solo script y mostrará que este archivo se está ejecutando 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 
+1

Stack Overflow no es Twitter. Por favor tómese el tiempo para deletrear palabras tales 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 formateo adecuado. Los comandos que se emitirán desde la línea de comandos, como 'ps', y los extractos de código como' #!/Bin/sh' deben formatearse. –

+0

Intenté limpiar el inglés aquí, pero aún 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 único comando en una lista de procesos. Esto no es realmente cierto. – tripleee

Cuestiones relacionadas