Escrevi um programa Python para fazer exactamente isto, chamado rerun
.
UPDATE: Esta resposta é um script Python que faz sondagens para alterações, o que é útil em algumas circunstâncias. Para um script Bash apenas para Linux que usa inotify, veja a minha outra resposta, procure nesta página por ‘rerun2’.
Instalar para Python2 ou Python3 com:
pip install --user rerun
e o uso é muito simples:
rerun "COMMAND"
O comando é esperado como um único arg, e não como uma sequência de args separados por espaço. Por isso cite-o como mostrado, o que reduz qualquer fuga extra que teria de adicionar. Basta digitar o comando como o teria digitado na linha de comando, mas rodeado de aspas.
Por defeito, observa todos os ficheiros dentro ou sob o directório actual, saltando coisas como dirs de controlo de origem conhecidos, .git, .svn, etc.
Os sinalizadores opcionais incluem ‘-i NAME’ que ignora alterações a ficheiros ou directórios nomeados. Isto pode ser dado várias vezes.
Como é um script Python, precisa de correr o comando como um subprocesso, e nós usamos uma nova instância da actual shell do utilizador para interpretar ‘COMMAND’ e decidir qual o processo a correr de facto. No entanto, se o seu comando contém alias shell e similares definidas em .bashrc, estas não serão carregadas pela sub-construção. Para corrigir esta situação, pode dar um sinal ‘-I’, para usar sub-camadas interactivas (também conhecidas como ‘login’). Isto é mais lento e mais sujeito a erros do que iniciar uma shell normal, porque tem de obter o seu .bashrc.
Eu utilizo-o com o Python 3, mas por último verifiquei que a repetição ainda funciona com o Python 2.
Espada de dois gumes é que utiliza a sondagem em vez da inotificação. No lado positivo, isto significa que funciona em todos os sistemas operativos. Além disso, é melhor do que algumas outras soluções mostradas aqui em termos de apenas executar o comando dado uma vez para um monte de alterações no sistema de ficheiros, não uma vez por ficheiro modificado, enquanto ao mesmo tempo executa o comando uma segunda vez se algum ficheiro mudar novamente enquanto o comando está a correr.
No lado negativo, a sondagem significa que existe uma latência de 0.0 a 1.0 segundo, e claro que é lento a monitorizar directórios extremamente grandes. Dito isto, nunca encontrei um projecto suficientemente grande para que isto seja sequer perceptível desde que se use ‘-i’ para ignorar coisas grandes como o seu virtualenv e node_modules.
Hmmm. rerun
tem sido indispensável para mim durante anos - basicamente utilizo-o oito horas todos os dias para executar testes, reconstruir ficheiros de pontos enquanto os edito, etc. Mas agora venho digitar isto aqui, é claro que preciso de mudar para uma solução que usa inotify (já não uso Windows ou OSX.) e está escrito em Bash (por isso funciona com pseudónimos sem qualquer manipulação extra).