GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué es Shebang en Linux Shell Scripting?

A menudo te encontrarás con scripts de shell que comienzan con:

#!/bin/bash

Este #! se llama shebang o hashbang. El shebang juega un papel importante en la creación de scripts de shell, especialmente cuando se trata de diferentes tipos de shell.

En este tutorial, aprenderá:

  • ¿Qué es Shebang?
  • ¿Qué papel desempeña en las secuencias de comandos de shell?

¿Qué es shebang en scripts de shell?

El shebang es la combinación de # (tecla numeral) y ! (signo de exclamación). Esta combinación de caracteres tiene un significado especial cuando se usa en la primera línea del guión. Se utiliza para especificar el intérprete con el que se ejecutará el script dado de forma predeterminada.

Entonces, si la primera línea de un script es:

#!/bin/bash

Significa que el intérprete debe ser bash shell. Si la primera línea es:

#!/bin/zsh

Significa que el intérprete que se utilizará es Z shell.

Él #! seguramente es especial porque # se usa para comentarios en scripts de shell, pero aquí tiene un significado especial.

¿Por qué el shebang importa en shell scripting?

Aquí está la cosa. El shebang seguido del ejecutable del shell no es obligatorio para un script.

Si escribe un script simple como este:

echo "Namaste, folks!"

Y dale permiso de ejecución y ejecútalo con el . operador, será ejecutado por su shell de inicio de sesión.

[email protected]:~$ cat sample 
echo "Namaste, folks!"
[email protected]:~$ chmod u+x sample 
[email protected]:~$ ./sample 
Namaste, folks!

Entonces, ¿por qué los scripts de shell incluyen la línea #!/bin/bash al comienzo del script?

Porque hay varios shells disponibles para sistemas Linux y UNIX. Si bien estos shells tienen una sintaxis en su mayoría común, tienen una sintaxis diferente o una forma diferente de manejar las cosas.

Por eso es importante especificar el intérprete de shell correcto en el script, de lo contrario, algunos scripts pueden producir resultados diferentes cuando se ejecutan en diferentes shells.

Déjame mostrártelo con un ejemplo simple.

Importancia de especificar el intérprete de shell con shebang

He escrito un script de shell de muestra con una variedad de distribuciones. El script luego muestra la distribución en el índice 2.

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

No he agregado la línea shebang para especificar ningún intérprete de shell. Esto significa que cuando ejecute este script, lo ejecutará el shell predeterminado (bash en mi caso):

[email protected]:~$ echo $0
bash

¿Puedes adivinar el resultado del guión?

[email protected]:~$ ./arrays.sh 
Distro at index 2 is: SUSE

Muestra SUSE en el índice 2 porque el índice de matriz comienza en 0 en Bash y muchos otros lenguajes de programación y secuencias de comandos. PERO ese no es el caso en Z shell. En el shell Z, el índice de matriz comienza en 1.

Tengo Z shell instalado en mi sistema. Cambio la secuencia de comandos y agrego la línea Shebang para especificar que Z Shell debe ejecutar la secuencia de comandos de manera predeterminada.

#!/bin/zsh

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

¿Puedes adivinar el resultado cuando ejecuto el script ahora?

[email protected]:~$ ./arrays.sh 
Distro at index 2 is: Fedora

¿Notas la diferencia ahora? Es el mismo guión, pero la adición de la línea shebang marcó la diferencia.

Y es por eso que es importante especificar el intérprete de shell correcto con el operador shebang. Como administrador de sistemas, puede escribir scripts de shell teniendo en cuenta un shell específico, ya sea bash, ksh o zsh. Pero no puede estar seguro de que el sistema que ejecutará el script tendrá el mismo shell predeterminado que el suyo. Ahora las cosas tienen sentido, ¿verdad?

Shebang se ignora si especifica explícitamente shell

¿Por qué estoy haciendo hincapié en el shell "predeterminado"? Porque el shebang especifica el intérprete para ejecutar el script.

Sin embargo, puede especificar el caparazón explícitamente y, en tales casos, se ignorará la línea shebang.

¿Cómo funciona exactamente el shebang?

Cuando usa shebang en la primera línea de un script, le está diciendo al shell que ejecute el script dado con el comando especificado.

Básicamente, #!/bin/zsh es equivalente a:

/bin/zsh script_name

Le he dicho que si la primera línea de un script comienza con shebang, significa que está especificando el intérprete de shell.

Eso es sólo parcialmente cierto. En realidad, ese es el propósito del carácter shebang. Pero no es necesario que shebang line tenga un ejecutable de shell. Puede ser cualquier cosa.

Por ejemplo, voy a reemplazar #!/bin/zsh con #!/bin/cat . /bin/cat es el ejecutable del comando cat.

#!/bin/cat

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

Esto significa que ahora este script se ejecutará con cat comando y mostrar el contenido de la secuencia de comandos.

Funcionará siempre que apunte a un comando ejecutable. Si pones algunas cosas al azar, arrojará un error.

Cambio la línea shebang a:

#!/home/abhishek

Claramente, no apunta al ejecutable de ningún comando y, por lo tanto, arroja un error de interpretación incorrecto.

[email protected]:~$ cat arrays.sh 
#!/home/abhishek

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
[email protected]:~$ ./arrays.sh 
bash: ./arrays.sh: /home/abhishek: bad interpreter: Permission denied

Conclusión

Permítanme responder algunas preguntas más antes de terminar este artículo:

  • Es importante que no haya espacio entre # y ! . NO PUEDES usarlo así:# !/bin/bash .
  • La mayoría de los sistemas permiten espacio entre #! y /bin/bash sin embargo, es una buena práctica evitar el espacio entre #! y /bin/bash .
  • #! tiene que estar en la primera línea, de lo contrario, la línea shebang se tratará como un comentario. Ni siquiera puede tener una línea en blanco antes.

¡Espero que entiendas mejor por qué #! se utiliza al principio de los scripts de shell en Linux. No dude en dejar un comentario si tiene preguntas o sugerencias.


Linux
  1. ¿Qué significa `:-` en un script de Shell?

  2. ¿Qué son los scripts de Shell? ¿Cómo crear scripts de Shell?

  3. Símbolo de acento grave (`) en Linux Shell Scripting

  4. Ejecute un script canalizado desde stdin (Linux/Shell Scripting)

  5. ¿Qué hace % en las cadenas de shell de Linux?

¿Qué es el Shell en Linux?

Cómo almacenar un comando de Linux como una variable en el script de Shell

Cómo ejecutar Shell Script como servicio SystemD en Linux

Imprimir el tiempo de ejecución de la secuencia de comandos de Shell en Linux

¿Qué es Subshell en Linux?

¿Qué es Login Shell en Linux?