Depois de executar cada comando de longa duração, você precisa lembrar que ele foi executado. A maneira de lembrar que algo aconteceu é armazenar as informações em um arquivo.
Se o efeito de um desses comandos for criar um arquivo, você poderá testar a presença desse arquivo. Há algumas coisas para se ter cuidado:
- Se o comando criar um arquivo de saída e o preencher em vários estágios, e falhar no meio, você terminará com um arquivo parcial. A solução é fazer o comando gravar em um arquivo temporário e renomear o arquivo temporário para o nome final depois que o comando for concluído com êxito.
- Se o arquivo de saída já existia antes do comando ser executado, você precisa de uma maneira de saber se o arquivo de saída está atualizado. Isso geralmente é resolvido comparando-se o horário de modificação dos arquivos de entrada e do arquivo de saída: se o arquivo de saída for mais recente que os arquivos de entrada, isso indica que ele foi regenerado.
Tudo isso é o trabalho básico das ferramentas de automação de criação . Você pode usar a ferramenta tradicional, make . É construído em torno do conceito de “se o arquivo B é construído a partir do arquivo A, e A é mais recente que B ou B não existe, então execute o comando para gerar B de A”. A sintaxe para isso é
B: A
command-to-generate-B-from-A
onde a segunda linha começa com um caractere de tabulação, não com espaços.
Se o comando não criar seu arquivo de saída atomicamente, faça-o gravar em um arquivo temporário:
B: A
mycommand <A >B.tmp
mv B.tmp B
Note que se mycommand
falhar, make não executará o segundo comando, então B
não será criado.
Para criar B, execute o comando make B
. Se B já existir e for mais recente que A, o make não executará mycommand
novamente.
Faça regras de cadeias automaticamente. Se você tem uma regra para construir B de A e uma regra para construir C de B, e somente A existe, então make C
constrói automaticamente B e C.
Se não houver nenhum arquivo que mostre que o comando foi executado, você pode criar um arquivo vazio apenas para lembrar.
command1.timestamp:
command1
touch command1.timestamp
command2.timestamp:
command2
touch command2.timestamp
A execução de make command2.timestamp
não faz nada se command2.timestamp
já existir. Caso contrário, ele primeiro executará command1
, a menos que command1.timestamp
já exista e, em seguida, execute command2
.