Obviamente, existem algumas diferenças entre arquivos executáveis em bin
diretórios e arquivos "de origem" editáveis.
- Para 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 conseguem varrer a
#!
linha.
- Para módulos, eles são usados apenas por um conjunto de programas relacionados, todos os quais usam o mesmo intérprete (ou nenhum intérprete), e é convencional incluir
.pm
, .sh
ou .so
nesses casos.
- Para programas executáveis, seu nome faz parte do "contrato de programação" pelo qual os usuários e outros scripts o invocam. É importante que o nome não mude, mesmo que a implementação mude ; então, obviamente, o nome do arquivo não deve ter um sufixo
No caso de um programa compilado, a diferença entre "origem" e "executável" é óbvia: uma contém código fonte, a outra contém linguagem de máquina ou interpretado por código. No caso de um script, não há diferença óbvia, mas o make
comando 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 "shell script" é simplesmente cp
.
Eu recomendaria manter um $HOME/source
diretório separado e:
- mantendo um link simbólico, como feito por
ln -s ../source/foo.sh $HOME/bin/foo
; ou
- copie-os manualmente após fazer alterações (e testá-los), usando
install -m 755 foo.sh ../bin/foo
; ou
- usando uma
Makefile
regra para executar uma verificação de sintaxe antes de copiar o arquivo de origem $HOME/source
para o$HOME/bin
Nota de rodapé: um módulo de script de shell é utilizável apenas 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 convenção geral, os módulos entram /usr/lib/name_of_program/name_of_module.sh
enquanto os comandos entram /usr/bin/name_of_command
(sem nenhum sufixo).