GNU/Linux >> Tutoriales Linux >  >> Linux

¿El script de Shell funciona bien sin la línea shebang? ¿Por qué?

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 tiene #! entonces debería ejecutar un shell POSIX. Pero los shells modernos no son compatibles con POSIX. El antiguo Korn Shell 88 (ksh88) ejecutaba el shell Bourne (cercano a un shell POSIX) sin #! línea, pero ksh93 rompe eso, y también lo hace Bash. Tanto con ksh93 como con Bash, ejecutan su propio shell si no #! la línea está presente.

A pesar de la opinión popular, los proyectiles Bash y Korn difieren. Cuando escribe un script de shell, nunca puede estar seguro de qué shell se ejecutará, o incluso si se ejecutará desde otro 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, será derrotado.

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


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

El execve falló, por lo que se activó una antigua función de compatibilidad con Unix, anterior a la existencia de Shebang Lines. Supuso que un archivo que tiene permiso de ejecución pero que el núcleo no reconoce como un archivo ejecutable válido debe ser un script de shell.

Por lo general, el shell principal adivina que el script está escrito para el mismo shell (los shells mínimos tipo Bourne ejecutan el script con /bin/sh , bash lo ejecuta como un subproceso bash), csh hace algunas conjeturas más complicadas basadas en el primer carácter porque también es anterior a shebang y necesitaba coexistir con Bourne shell).

Necesita una línea shebang cuando sabe que estas conjeturas serán incorrectas (por ejemplo, con shebang es #!/usr/bin/perl ), o cuando no confía en que las conjeturas funcionen de manera consistente, o cuando el script debe ser ejecutable por un proceso principal que no es un shell en sí mismo.


se necesita línea shebang en el archivo y solo si está destinado a ejecutarse como ejecutable (a diferencia de sh file.sh invocación. En realidad, el script no lo necesita, es para que el sistema sepa cómo encontrar el intérprete.

EDITAR :Lo siento por leer mal la pregunta. Si falta la línea shebang o no se reconoce, /bin/sh se usa Pero prefiero ser explícito sobre el intérprete.

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


Linux
  1. ¿Por qué "sudo Su" en un script de Shell no ejecuta el resto del script como root?

  2. ¿Cómo pasar un argumento de línea de comando a un script de Shell?

  3. Manera de incrustar un binario ejecutable en un script de Shell sin herramientas adicionales?

  4. Shell script directorio actual?

  5. Cómo ejecutar un archivo sin extensión .sh en shell

¿Qué es Shebang en Linux Shell Scripting?

Obtenga una línea específica del archivo de texto usando solo un script de shell

Agregue una línea al archivo /etc/hosts con script de shell

¿Cómo insertar una nueva línea en el script de shell de Linux?

Cálculo del porcentaje redondeado en Shell Script sin usar bc

Matar el programa después de que genera una línea dada, desde un script de shell