scripting – ¿El shebang determina el shell que ejecuta el script?

Pregunta:

Esta puede ser una pregunta tonta, pero aún la hago. Si he declarado un shebang

#!/bin/bash 

al comienzo de my_shell_script.sh , entonces siempre tengo que invocar este script usando bash

[my@comp]$bash my_shell_script.sh

o puedo usar eg

[my@comp]$sh my_shell_script.sh

y mi script determina el shell en ejecución usando el shebang? ¿Ocurre lo mismo con ksh shell? Estoy usando AIX.

Respuesta:

¡El tinglado #! es una instancia legible por humanos de un número mágico que consta de la cadena de bytes 0x23 0x21 , que es utilizada por la familia de funciones exec() para determinar si el archivo que se ejecutará es un script o un binario. Cuando el shebang está presente, exec() ejecutará el ejecutable especificado después del shebang.

Tenga en cuenta que esto significa que si invoca un script especificando el intérprete en la línea de comando, como se hace en ambos casos dados en la pregunta, exec() ejecutará el intérprete especificado en la línea de comando, ni siquiera verá la secuencia de comandos.

Entonces, como otros han señalado, si desea que exec() invoque al intérprete especificado en la línea shebang, el script debe tener el bit ejecutable establecido e invocado como ./my_shell_script.sh .

El comportamiento es fácil de demostrar con el siguiente script:

#!/bin/ksh
readlink /proc/$$/exe

Explicación:

  • #!/bin/ksh define ksh como el intérprete.

  • $$ contiene el PID del proceso actual.

  • /proc/pid/exe es un enlace simbólico al ejecutable del proceso (al menos en Linux; en AIX, /proc/$$/object/a.out es un enlace al ejecutable).

  • readlink generará el valor del enlace simbólico.

Ejemplo:

Nota : Estoy demostrando esto en Ubuntu, donde el shell predeterminado /bin/sh es un enlace simbólico al guión, es decir, /bin/dash y /bin/ksh es un enlace simbólico a /etc/alternatives/ksh , que a su vez es un enlace simbólico a /bin/pdksh .

$ chmod +x getshell.sh
$ ./getshell.sh 
/bin/pdksh
$ bash getshell.sh 
/bin/bash
$ sh getshell.sh 
/bin/dash

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım