Obviamente, existem algumas diferenças entre arquivos executáveis nos diretórios bin
e arquivos "fonte" editáveis.
- Para os arquivos de origem, é útil ter um sufixo para que você possa ver o que é o quê e ajudar algumas ferramentas menos inteligentes que não analisam a linha
#!
.
- Para módulos, eles são usados apenas por um conjunto relacionado de programas, todos usam o mesmo intérprete (ou nenhum interpretador) e é convencional incluir
.pm
, .sh
ou .so
em tais casos.
- Para programas executáveis, seu nome é parte do "contrato de programação" pelo qual usuários e outros scripts o invocam. É importante que o nome não mude mesmo se a implementação o fizer; então obviamente o nome do arquivo deve não ter um sufixo
No caso de um programa compilado, a diferença entre "source" e "executable" é óbvia: um contém código-fonte, o outro contém linguagem de máquina ou bytecode interpretado. No caso de um script, não há nenhuma diferença óbvia, mas o comando make
mantém uma separação nocional entre o "código-fonte de um script" e a "versão executável de um script": seu "compilador" padrão para "script de shell" "é simplesmente cp
.
Eu recomendaria manter um diretório $HOME/source
separado e:
- mantendo um link simbólico, como feito por
ln -s ../source/foo.sh $HOME/bin/foo
; ou
- copie-os manualmente depois de fazer alterações (e testá-los) usando
install -m 755 foo.sh ../bin/foo
; ou
- usando uma regra
Makefile
para executar uma verificação de sintaxe antes de copiar o arquivo de origem de $HOME/source
para $HOME/bin
Nota de rodapé: um módulo de script de shell só pode ser usado por outro script de shell e modifica o contexto interno desse script usando os comandos internos .
ou source
. Isso é diferente de um script executável, que (como qualquer programa) é executado como um processo separado e não pode modificar seu processo pai. Como uma convenção aproximada, os módulos vão em /usr/lib/name_of_program/name_of_module.sh
enquanto os comandos vão em /usr/bin/name_of_command
(sem nenhum sufixo).