Soy nuevo en los scripts de shell y muchos libros han escrito que usan la línea #! (Sha-bang) al inicio del script para invocar al intérprete. Y esto invocará un nuevo shell para el script y hará la interpretación línea por línea. Pero uno de mi script básico todavía se está ejecutando sin la línea mágica.
entonces mis preguntas son:
- ¿De dónde sacó mi guión básico el intérprete?
- ¿Cómo logró el guión localizar al intérprete?
ahora déjame contarte sobre mi script básico, solo contiene la siguiente línea:
echo "guión básico sin las líneas mágicas"
bash
shell-script
usuario1678213
fuente
fuente

Respuestas:
Si no se proporciona la línea mágica, se utiliza un shell predeterminado para ejecutar el script. Este shell predeterminado podría ser Bourne shell (sh), como es el caso en algunos tipos, sin embargo, en algunos otros tipos, el shell predeterminado utilizado es el mismo que el de inicio de sesión para ejecutarlo. La cuestión es: no deje que el sistema decida el shell, siempre proporcione el shell que desea en la primera línea.
fuente
/bin/sh, solo para ser el primershejecutable encontrado al explorar una RUTA conforme.Cuando ejecuta un programa, el núcleo verifica si comienza por alguna secuencia de bytes mágicos . Si el archivo ejecutable comienza con
#!, el núcleo interpreta el resto de la línea como un nombre de intérprete. Si el archivo ejecutable comienza con\177ELF(donde\177está el byte 127), carga el archivo como un ejecutable ELF ; Ese es el tipo normal en la mayoría de los sistemas Unix hoy en día.Si el núcleo no reconoce el formato del archivo, se niega a ejecutar el archivo y devuelve el error ENOEXEC (error de formato Exec). Cuando el shell se da cuenta de eso, se encarga de ejecutar el programa como un script de shell.
Para presenciar esto en acción, agregue algunos comandos a su script:
(Esto es para Linux, ajústelo para otras unidades). Luego intente ejecutar ese script desde varios shells. Verá que algunos shells generan nuevas instancias de sí mismos para ejecutar el script (bash, ksh93) mientras que otros generan
/bin/sh(dash, pdksh, zsh).fuente
ls -lcomando? Esto:lrwxrwxrwx 1 i 0 Oct 11 05:15 exe -> /bin/bash-? Si es así, ¿qué dice? Además, noté que teníaSHELL=/bin/bashencendidoenv, pero cambiarlo no parecía cambiar el comportamiento. Tal vez no está relacionado?ls -l /proc/$$/exe, de hecho). Losexeenlaces apuntan al shell que está ejecutando su script. Cuando ejecutas tu script, verás que es bash el que interpreta el script. Si lo ejecuta, por ejemplo, pdksh, se ejecuta/bin/sh. No conozco ningún shell que use laSHELLvariable de entorno o el shell de inicio de sesión en esa circunstancia./etc/passwdcambia lo que se ejecuta al iniciar sesión a través de SSH o en una consola de texto. No cambia qué shell podría ejecutar scripts./etc/passwdpara decidir qué shell usar, se bifurcaron o se ejecutaron/bin/sh.Probablemente sea una de las siguientes 3 posibilidades:
Está llamando al script directamente con el intérprete, IE: bash script.sh
El nombre del archivo de script tiene una extensión .sh, que hace que el sistema busque el programa predeterminado para este tipo de archivo
El entorno de shell que está utilizando está ejecutando el 'eco' por sí mismo, ya que solo puedo adivinar que el archivo de script es ejecutable. Si, por ejemplo, usará un shell bash y tiene un comando en su archivo que solo usa ksh, verá que no funcionará.
¡Buena suerte!
fuente