Obviamente, hay algunas diferencias entre los archivos ejecutables en los bin
directorios y los archivos "fuente" editables.
- Para los archivos de origen, es útil tener un sufijo para que pueda ver qué es qué y para ayudar a algunas herramientas menos inteligentes que no pueden escanear la
#!
línea.
- Para los módulos, solo los usan un conjunto relacionado de programas, todos los cuales usan el mismo intérprete (o ningún intérprete), y es convencional incluirlos
.pm
, .sh
o .so
en tales casos.
- Para los programas ejecutables, su nombre es parte del "contrato de programación" por el cual los usuarios y otros scripts lo invocan. Es importante que el nombre no cambie incluso si la implementación lo hace; así que obviamente el nombre del archivo no debería tener un sufijo
En el caso de un programa compilado, la diferencia entre "fuente" y "ejecutable" es obvia: una contiene código fuente, la otra contiene lenguaje de máquina o código de bytes interpretado. En el caso de un script, no hay una diferencia obvia, pero el make
comando mantiene una separación teórica entre el "código fuente de un script" y la "versión ejecutable de un script": su "compilador" predeterminado para "shell script" es simplemente cp
.
Recomendaría mantener un $HOME/source
directorio separado y:
- mantener un enlace simbólico, como el realizado por
ln -s ../source/foo.sh $HOME/bin/foo
; o
- copiarlos manualmente después de hacer cambios (y probarlos), usando
install -m 755 foo.sh ../bin/foo
; o
- usando una
Makefile
regla para realizar una comprobación de sintaxis antes de copiar el archivo de origen desde $HOME/source
dentro$HOME/bin
Nota al pie: un módulo de script de shell solo puede ser utilizado por otro script de shell y modifica el contexto interno de ese script utilizando los comandos .
o source
los comandos integrados. Esto es diferente de un script ejecutable, que (como cualquier programa) se ejecuta como un proceso separado y no puede modificar su proceso padre. Como una convención aproximada, los módulos entran /usr/lib/name_of_program/name_of_module.sh
mientras que los comandos entran /usr/bin/name_of_command
(sin ningún sufijo).