¿Usar extensión .sh o .bash para los scripts de bash?

36

(Consulte Use #! / Bin / sh o #! / Bin / bash para ver la compatibilidad y la facilidad de uso de Ubuntu-OSX y POSIX )

Si quiero que mis scripts utilicen el shell bash, ¿el uso de la extensión .bash realmente invoca bash o depende de la configuración del sistema / primera línea shebang? Si ambos estuvieran vigentes pero fueran diferentes, ¿cuál tendría prioridad?

No estoy seguro de si terminar mis scripts con .sh para indicar simplemente "script de shell" y luego hacer que la primera línea seleccione el shell bash (por ejemplo #!/usr/bin/env bash) o si simplemente terminarlos con .bash (así como la configuración de la línea 1) ) Quiero que se invoque a bash.

Michael Durrant
fuente
3
No creo haber visto nunca una .bashextensión. Además, es política de Debian tener scripts en paquetes que aterrizan en una de las bincarpetas para no tener extensiones.
muru

Respuestas:

19

el uso de la extensión .bash en realidad invoca bash o depende de la configuración del sistema / primera línea shebang.

Si no utiliza un intérprete explícitamente, el intérprete que se invoca está determinado por el shebangutilizado en el script. Si utiliza un intérprete específicamente, al intérprete no le importa qué extensión le dé a su guión. Sin embargo, la extensión existe para que sea muy obvio para otros qué tipo de script es.

[sreeraj@server ~]$ cat ./ext.py
#!/bin/bash
echo "Hi. I am a bash script"

Vea, la .pyextensión del script bash no lo convierte en un script python.

[sreeraj@server ~]$ python ./ext.py
  File "./ext.py", line 2
    echo "Hi. I am a bash script"
                                ^
SyntaxError: invalid syntax

Siempre es un bashguión.

[sreeraj@server ~]$ ./ext.py
Hi. I am a bash script
Sree
fuente
23

El nombramiento del script no tiene nada que ver con cómo se ejecuta.

La línea shebang define qué intérprete se usa para ejecutar el script.

Personalmente no me importa si un script es sh, bash, perl, lo que sea, así que solo lo nombro por lo que hace; Encuentro agregar una extensión redundante. Haré file scriptnamepara averiguar cuál es el archivo si quiero saber eso.

Entonces, si desea que se ejecute su script bash, úselo #!/bin/bashcomo la primera línea.

wurtel
fuente
44
Además, si la elección de implementación para el script cambia (digamos que está reescrito en Python, Perl, C ...), no tener una .shextensión de estilo significa que no hay necesidad de cambiarle el nombre. (Es cierto que no hay nada que impida que un programa C produzca un binario con una .shextensión, sería confuso).
Stephen Kitt,
2
Uso #!/usr/bin/env bashpara portabilidad, discutido aquí stackoverflow.com/a/10383546/54964
Léo Léopold Hertz 준영
44
@wurtel (comentario tardío, ¿de acuerdo?) Agregar una extensión en mi humilde opinión está lejos de ser redundante. La mayoría de los editores admiten el resaltado de sintaxis basado en la extensión, además tiene sentido tener una visibilidad inmediata del tipo de archivo. La claridad y la legibilidad importan mucho.
RolfBly
@RolfBly: los editores que uso reconocen el shebang y proporcionan resaltado de sintaxis. La claridad es útil, pero la mayoría de las veces queremos ejecutar un comando y es bueno si tengo que escribir menos y no tengo que recordar su lenguaje de implementación.
Hontvári Levente