¿Debo guardar mis scripts con la extensión .sh?

66

Tengo algunos scripts funcionales y quiero copiarlos /usr/bin. Quiero usarlos como comandos de terminal normales. ¿Es una buena práctica usarlos con la .shextensión o puedo guardarlos sin extensión?

Patterson
fuente
66
Además, si desea que esos scripts estén disponibles para todos los usuarios, /usr/local/binpuede ser una mejor opción.
Salem
66
@Salem /usr/biny /usr/local/binambos deberían estar disponibles para todos los usuarios, pero /usr/local/bines mejor para los ejecutables que no forman parte de los paquetes.
gerrit
El único beneficio que he visto es que los editores como vim o nano saben cómo resaltar desde el principio, y eso es todo.
rath
1
@rath Obtengo resaltado de sintaxis sin la extensión si tengo el shebang establecido en #!/usr/bin/env basho #!/bin/bash.
Sparhawk
@Sparhawk De hecho, pero a menudo lo olvido hasta que trato de ejecutar el script;)
rath

Respuestas:

71

No, no es una buena práctica, debe mantener sus scripts sin extensión. Tenga en cuenta que los scripts que forman parte de los paquetes no tienen una extensión .sh , es decir, update-grub , no update-grub.sh . Si aún no está convencido, tenga en cuenta que la Guía de estilo de Google Shell dice:

Los ejecutables no deben tener extensión (muy recomendable) o una extensión .sh. Las bibliotecas deben tener una extensión .sh y no deben ser ejecutables.

PD No tienes que poner tu guión /bin. Puedes crear un directorio ~/biny poner tu script allí. El directorio ~/binestá incluido $PATHde forma predeterminada, por lo que los scripts que se colocan allí se pueden ejecutar como cualquier otro comando de shell.

Comunidad
fuente
44
"El directorio ~ / bin está incluido $PATHpor defecto" - ¿Desde cuándo? De todos modos, ~/.local/bines probablemente una mejor opción, ya que es un estándar.
nyuszika7h
1
¿Quieres decir que "las bibliotecas deben tener una extensión .so", verdad? No sh.
Keith Wolters
3
@KeithWolters primero, no yo, sino Google. En segundo lugar, .sh, no .so, estamos hablando de scripts de shell, no de binarios.
1
La guía de estilo de Google es muy específica para Google. Por ejemplo, "Bash es el único lenguaje de scripting de shell permitido para ejecutables". Claramente una regla interna en lugar de mejores prácticas.
Paul Draper
1
@ nyuszika7h echa un vistazo a ~ / .profile ... inserta $ HOME / bin en tu ruta si el directorio existe
Corey Goldberg
9

Secundo la recomendación de usar ~/binque se agrega automáticamente a tu $PATH, como dijo Sergey . O /usr/local/bin, que ya puede estar en el PATH. Sin embargo:

  • Estás haciendo esto por ti mismo. Use lo que le resulte más cómodo. De hecho, diría que conserve la extensión para que se le recuerde que es su script el que está ejecutando, ya que:
  • Las extensiones son poco comunes en /usr/bin. En mi sistema, solo puedo encontrar dos:

    $ dpkg -S `ls /usr/bin/*.sh`
    mtools: /usr/bin/amuFormat.sh
    gettext-base: /usr/bin/gettext.sh

    Entonces, si está empacando, definitivamente omita la extensión.

muru
fuente
2
~/binse agrega $PATHautomáticamente si existe, no es necesario agregarlo manualmente. Simplemente cree el directorio, cierre la sesión y vuelva
Sergey
5

Simplemente ponga la siguiente línea en la parte superior del archivo:

#!/bin/bash

Entonces, ese archivo se escribirá automáticamente: Shell Script sin ninguna extensión.

Recuerde dar permiso de ejecución para presentar.

Para poner el script de manera que pueda ejecutarse mediante un comando directo, visite: ¿Dónde debo colocar mi script para que pueda ejecutarlo mediante un comando directo?

Pandya
fuente
2
O incluso simplemente #! / Bin / sh si no necesita el shell bash completo.
flickerfly
Muchos sistemas operativos enlazan / bin / sh y / bin / bash
Max Coplan