scripts script resueltos programas programacion pasar parametros español ejercicios ejemplos comandos linux perl bash shell unix

programas - scripts linux ejercicios resueltos



Shell script funciona bien sin línea shebang? ¿Por qué? (3)

Esta pregunta ya tiene una respuesta aquí:

Estaba escribiendo un script de shell simple y descubrí que mi script de shell no requiere la línea shebang

#!/bin/sh

Si doy permisos de ejecución a mi script y ejecuto usando ./myscript.sh . Funciona bien.

Estoy usando bash shell y /bin/sh realidad apunta a bash .

lrwxrwxrwx 1 root root /bin/sh -> bash

Sé que la línea shebang se usa para decirle a shell qué intérprete usar para el resto de la secuencia de comandos.

Si pierdo shebang line en perl, otorga permisos de ejecución y ejecuta ./myscript.pl , no funciona.

¿Qué está pasando aquí realmente? Si uso ./ , ¿cuándo es realmente necesaria la línea shebang?


El estándar POSIX (Single UNIX Specification 4) no es útil:

Si la primera línea de un archivo de comandos de shell comienza con los caracteres "#!" , los resultados no están especificados.

Entonces, el estándar implica que si no tienes #! entonces debería ejecutar un shell POSIX. Pero las conchas modernas no son compatibles con POSIX. El antiguo Korn Shell 88 (ksh88) ejecutó el shell Bourne (cerca de un shell POSIX) sin #! línea, pero ksh93 rompe eso, y también lo hace Bash. Con ksh93 y Bash, ejecutan su propia shell si no #! la linea esta presente

A pesar de la opinión popular, los proyectiles Bash y Korn difieren. Cuando escribe un script de shell, nunca podrá estar seguro de qué shell ejecutará, o incluso si se ejecutará desde otra shell (la mayoría de los lenguajes de programación pueden ejecutar otros programas). En el momento en que use algo fuera de la sintaxis de Bourne / POSIX, se verá afectado.

Siempre use un #! Línea, no lo dejes al azar.


El shell principal, donde ingresó ./myscript.sh , primero intentó execve , que es donde la línea de shebang tendría efecto si estuviera presente. Cuando esto funciona, el padre no se da cuenta de la diferencia entre los scripts y los ELF porque el kernel se ocupa de ello.

El execve falló, por lo que se activó una antigua característica de compatibilidad de Unix, anterior a la existencia de líneas de shebang. Se supuso que un archivo que tiene permiso de ejecución pero que el kernel no reconoce como un archivo ejecutable válido debe ser un script de shell.

Por lo general, el shell primario adivina que el script está escrito para el mismo shell (los shells de tipo Bourne mínimo ejecutan el script con /bin/sh , bash lo ejecuta como un subproceso bash), csh realiza un adivinamiento más complicado basado en el primer carácter porque es anterior a Shebang y necesitaba coexistir con el shell Bourne).

Necesitas una línea de shebang cuando sabes que estas conjeturas serán incorrectas (por ejemplo, con el shebang es #!/usr/bin/perl ), o cuando no confías en que las conjeturas funcionen de manera coherente, o cuando el script deba ser ejecutable por un proceso padre que no es un shell en sí mismo.


shebang line es necesaria en el archivo y solo si se debe ejecutar como ejecutable (a diferencia de sh file.sh invocation. En realidad, el script no lo necesita, es para que el sistema sepa cómo encontrar un intérprete.

EDIT : Perdón por malinterpretar la pregunta. Si la línea de shebang falta o no se reconoce, se usa /bin/sh . Pero prefiero ser explícito sobre el intérprete.

Tenga en cuenta que este comportamiento no es universal, IIRC, solo una función de la familia exec* hace eso (sin mencionar las diferentes plataformas), así que esa es otra razón para ser explícito aquí.