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 primersh
ejecutable 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\177
está 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 -l
comando? Esto:lrwxrwxrwx 1 i 0 Oct 11 05:15 exe -> /bin/bash
-? Si es así, ¿qué dice? Además, noté que teníaSHELL=/bin/bash
encendidoenv
, pero cambiarlo no parecía cambiar el comportamiento. Tal vez no está relacionado?ls -l /proc/$$/exe
, de hecho). Losexe
enlaces 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 laSHELL
variable de entorno o el shell de inicio de sesión en esa circunstancia./etc/passwd
cambia 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/passwd
para 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