Como executar um comando do Linux quando um conjunto de arquivos muda

Gecko Studio / Shutterstock. com
Aprenda a executar comandos do Linux quando qualquer arquivo em um conjunto de arquivos monitorado muda e quando novos arquivos são criados. Mostramos como usar essa ferramenta flexível.
O Comando entr
Você pode definir comandos para serem executados em horários específicos no Linux, usando o cron. É fácil, confiável e flexível. Mas e se você precisar que os comandos sejam executados sempre que um arquivo for alterado ou se um novo arquivo for adicionado a um diretório? Isso também é possível e há mais de uma maneira de fazer isso. O comando entr é uma maneira simples e refrescante de obter essa funcionalidade.
Alguns sistemas, como o gerador de sites estáticos Hugo, têm um recurso que reconstrói automaticamente o seu site se um arquivo for alterado ou se um novo arquivo for adicionado ao site. Esse pequeno recurso faz uma diferença significativa em seu fluxo de trabalho. Com o Hugo, você pode ter sua versão de desenvolvimento do site no seu navegador enquanto edita os arquivos que compõem o seu site. Cada vez que você salva suas alterações ou cria um arquivo, o site é reconstruído em milissegundos e as alterações são enviadas para o seu navegador. O feedback instantâneo é fantástico.
O comando entr traz esse tipo de capacidade para qualquer conjunto de arquivos. O comando lançado quando uma alteração é detectada é arbitrário. Pode ser um comando padrão do Linux, um alias, uma função shell ou um script.
Instalando entr
Para instalar o entr no Ubuntu, use este comando:
sudo apt-get install entr

Para instalar o entr no Fedora, digite:
sudo dnf install entr

No Manjaro, o comando é:
sudo pacman -Syu entr

Um exemplo simples
Usaremos o comando de toque para criar um arquivo de texto chamado “ example. txt ” e diga a entr para monitorar esse arquivo.
Publicidade
O comando entr aceita os nomes de arquivo que deve monitorar via STDIN e aceita o comando que deve ser executado como parâmetros de linha de comando.
A maneira mais fácil de passar um nome de arquivo para entr é usar ls para listá-lo e canalizá-lo para entr. Quando o arquivo for alterado, entr lançará o comando wc para contar as linhas, palavras e caracteres no arquivo.
O parâmetro / _ é um espaço reservado para o nome do arquivo que foi passado para entr. Se um grupo de arquivos for passado para entr, como * . txt, o parâmetro / _ seria substituído pelo último arquivo a ser alterado.
toque em example. txt
ls example. txt | entr wc / _

Cada vez que as alterações são salvas no arquivo, entr inicia o wc. Para interromper a entrada, pressione q ou Ctrl + c.
RELACIONADO: O que são stdin, stdout e stderr no Linux?
Usos práticos
Agora que vimos o entr em ação e você entende o princípio, vamos dar uma olhada em alguns cenários mais úteis.
Faremos com que o entr monitore os arquivos no diretório atual. Se algum dos arquivos for modificado, queremos iniciar o make para reconstruirmos nosso projeto. Iremos encadear outro comando, make test, para executar alguns testes na nova compilação. O operador AND & & só iniciará o segundo comando se o primeiro for concluído sem problemas.
Publicidade
A opção -s (shell) garante que o interpretador usado seja aquele definido na variável de ambiente SHELL. Isso garante que entr receba o código de saída do primeiro comando make.
ls | entr -s 'make & & fazer teste '
Usar o comando ls para enviar a lista de todos os nomes de arquivos no diretório para entr é um pouco complicado. Você pode ter arquivos no diretório que fazem parte do projeto, mas não são realmente arquivos de construção. Talvez sejam notas de projeto ou uma lista de tarefas pendentes. Você não precisa ter seu projeto reconstruído toda vez que alterar um desses arquivos não codificados.
Podemos refinar o comando para que ele monitore apenas os arquivos de código-fonte apropriados. Este comando monitora o código-fonte C e os arquivos de cabeçalho.
ls *. [ch] | entr -s 'make & & fazer teste '
Claro, não estamos limitados a lançar o make. Você pode ter um script de construção personalizado que prefere usar.
ls *. [ch] | entr script. sh
Aproveitando o Git
O comando entr não é Git-ware, mas ainda podemos usar alguns dos recursos do Git para suavizar nosso fluxo de trabalho.
O comando git ls-file listará os arquivos que estão no índice do Git e na árvore de fontes de trabalho, levando em consideração as exceções que foram definidas em seu arquivo “ . gitignore ” Arquivo. Essa é uma lista pronta dos arquivos nos quais estamos interessados, então vamos usá-la como a fonte dos arquivos a serem monitorados.
git ls-files | entr script. sh
Publicidade
O comando ls-files aceita opções de linha de comando. Eles podem ser usados para filtrar ainda mais ou aumentar a lista de arquivos retornada pelo Git:
- -c: Mostra os arquivos em cache.
- -d: Mostra os arquivos excluídos.
- -m: Mostra os arquivos modificados .
- -o: Mostra arquivos não rastreados.
A opção --exclude-standard é uma forma abreviada de dizer ao Git para ignorar os arquivos que correspondem às entradas em “ . git / info / exclude ”, local “ . gitignore ” e global “ . gitignore ” arquivos.
git ls-files -cdmo --exclude-standard | entr 'make & & fazer teste '
Isso vai pegar uma série de eventualidades, mas não vai lidar com a criação de um novo arquivo. E o novo arquivo não estará no Git. Ainda podemos lidar com essa situação, usando um pouco de script Bash e um recurso de entr.
A opção -d (diretório) faz com que entr monitore os arquivos em um diretório e saia se um novo arquivo for adicionado. Envolvendo nosso comando entr em um loop while / do, toda a linha de comando entr será reiniciada automaticamente e o novo arquivo será selecionado e ativado. Arquivos e diretórios cujos nomes começam com um ponto final “. ” são ignorados.
enquanto verdadeiro; faça {git ls-files; git ls-files. --exclude-standard --outros; } | entr -d ./script. sh feito
Reiniciando servidores e intérpretes
Talvez você trabalhe com uma linguagem interpretada como Ruby. Cada vez que seu arquivo de programa é alterado, você precisa parar e reiniciar o interpretador Ruby. Você pode lidar com esses tipos de casos de uso com a opção -r (reiniciar).
Para monitorar um arquivo de programa chamado “ hello_world. rb ” e para parar e reiniciar o interpretador Ruby cada vez que o arquivo do programa muda, use este comando:
ls hello_world. rb | entr -r ruby hello_world. rb
Publicidade
Cada vez que o arquivo do programa é editado e salvo, o interpretador Ruby é reiniciado e o programa recarregado.

O programa inicialmente continha:
coloca "Olá, mundo!"
Foi editado para dizer:
coloca "Olá, CloudSavvyIT!"
Quando isso foi salvo, entr reiniciou o interpretador Ruby e recarregou o programa.
O arquivo foi editado mais uma vez para adicionar a palavra “ leitores ” e salvo no disco rígido.
coloca "Olá, leitores do CloudSavvyIT!"
Você pode ver os três resultados na captura de tela. Se você pressionar a barra de espaço, entr reiniciará o comando, independentemente de você ter alterado o arquivo do programa ou não.
Não apenas para programadores
Como o comando iniciado por entr pode ser qualquer coisa, incluindo scripts de shell, o escopo para usar entr para automatizar processos é virtualmente ilimitado.
Talvez você tenha um diretório com arquivos inseridos por FTP seguro, ou rsync ou curl. Você pode ter esses arquivos copiados automaticamente em outro lugar, ou compactados, ou pesquisados por grep pela palavra “ erro ”.
Publicidade
Isso o torna uma ótima ferramenta para administradores de sistema e desenvolvedores.
Nenhum comentário