linux - programas - scripts bash ejemplos
¿Por qué necesita poner#!/Bin/bash al principio de un archivo de script? (8)
Cada distribución tiene un shell por defecto. Bash es el valor predeterminado en la mayoría de los sistemas. Si resulta que trabajas en un sistema que tiene un shell predeterminado diferente, entonces los scripts podrían no funcionar según lo previsto si se escriben específicos para Bash.
Bash ha evolucionado a lo largo de los años tomando códigos de ksh
y sh
.
Al agregar #!/bin/bash
como la primera línea de su script, le indica al sistema operativo que invoque el shell
especificado para ejecutar los comandos que siguen en el script.
#!
a menudo se le conoce como "hash-bang", "she-bang" o "sha-bang".
He hecho scripts de Bash antes y todos funcionaron bien sin esto al principio. ¿Cuál es el punto de ponerlo en? ¿Serían las cosas diferentes?
Además, ¿cómo se pronuncia #
? ¡Lo sé !
se pronuncia como "bang".
Como es #!
¿pronunciado?
El shebang es una directiva para que el cargador use el programa que se especifica después de #!
como intérprete para el archivo en cuestión cuando intenta ejecutarlo. Entonces, si intenta ejecutar un archivo llamado foo.sh
que tiene #!/bin/bash
en la parte superior, el comando real que se ejecuta es /bin/bash foo.sh
Esta es una forma flexible de usar diferentes intérpretes para diferentes programas. Esto es algo implementado a nivel de sistema y la API de nivel de usuario es la convención de shebang.
También vale la pena saber que el shebang es un número mágico, un número legible por humanos que identifica el archivo como un script para el intérprete dado.
El punto sobre el que está "funcionando" incluso sin el shebang es solo porque el programa en cuestión es un script de shell escrito para el mismo shell que el que está utilizando. Por ejemplo, podría escribir un archivo javascript y luego poner un #! /usr/bin/js
#! /usr/bin/js
(o algo similar) para tener un "script de shell" de javascript.
El sistema operativo toma el shell predeterminado para ejecutar su script de shell. por lo tanto, al mencionar la ruta del shell al comienzo del script, le está pidiendo al sistema operativo que use ese shell en particular. También es útil para la portability .
Es una convención para que el shell * nix sepa qué tipo de intérprete debe ejecutar.
Por ejemplo, las versiones anteriores de ATT tienen el valor predeterminado de sh (el shell Bourne), mientras que las versiones anteriores de BSD tienen el valor predeterminado de csh (el shell C).
Incluso hoy (donde la mayoría de los sistemas ejecutan bash, el "Bourne Again Shell" ), los scripts pueden estar en bash, python, perl, ruby, PHP, etc., etc. Por ejemplo, puede ver #!/bin/perl
o #!/bin/perl5
.
PD: el signo de exclamación ( !
) Se llama cariñosamente "bang" . El símbolo de comentario de shell ( #
) a veces se llama "hash" .
PPS: Recuerde: bajo * nix, asociar un sufijo con un tipo de archivo es simplemente una convención , no una "regla" . Un ejecutable puede ser un programa binario, cualquiera de un millón de tipos de script y otras cosas también. De ahí la necesidad de #!/bin/bash
.
Para ser más precisos el shebang #!
, cuando se trata de los dos primeros bytes de un archivo ejecutable ( mode x
), es interpretado por la llamada al sistema execve(2) (que ejecuta programas). Pero la especificación POSIX para execve
no menciona el shebang.
Debe ir seguido de una ruta de archivo de un ejecutable de intérprete (que, por cierto, incluso podría ser relativa, pero la mayoría de las veces es absoluta).
Un buen truco (o quizás no tan bueno ) para encontrar un intérprete (por ejemplo, python
) en el $PATH
del usuario es usar el programa env
(siempre en /usr/bin/env
en todo Linux) como por ejemplo
#!/usr/bin/env python
Cualquier ejecutable ELF puede ser un intérprete. ¡Incluso podrías usar #!/bin/cat
o #!/bin/true
si quisieras! (pero eso sería a menudo inútil)
Puede ser útil para alguien que usa un sistema diferente que no tiene esa biblioteca fácilmente disponible. Si eso no está declarado y tiene algunas funciones en su script que no son compatibles con ese sistema, debe declarar # / bin / bash. Me he encontrado con este problema antes en el trabajo y ahora lo incluyo como una práctica.
Se llama un shebang . En unix-speak, # se llama sharp (como en música) o hash (como hashtags en twitter), y! se llama bang. (¡¡Puede hacer referencia a su comando de shell anterior con !!, llamado bang-bang). Así que cuando se ponen juntos, obtienes haSH-BANG, o shebang.
La parte después de la #! le dice a Unix qué programa usar para ejecutarlo. Si no está especificado, lo intentará con bash (o sh, o zsh, o cualquiera que sea su variable $ SHELL) pero si está ahí, usará ese programa. Además, # es un comentario en la mayoría de los idiomas, por lo que la línea se ignora en la ejecución posterior.
Se llama un shebang . Consiste en un signo de número y un carácter de signo de exclamación (#!), Seguido de la ruta completa al intérprete, como / bin / bash. Todos los scripts en UNIX y Linux se ejecutan utilizando el intérprete especificado en una primera línea.