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

Conteúdo

efeito dominó.

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 esta ferramenta flexível.

O comando entrar

Você pode configurar comandos para ser executado em horários específicos en Linux, usando cron. É facil, confiável e flexível. Mas, E se você precisar executar comandos sempre que um arquivo for alterado ou um novo arquivo for adicionado a um diretório? Isso também é viável, e há mais de uma maneira de fazer isso. a entr o comando é um refrescantemente simples maneira de alcançar essa funcionalidade.

Alguns sistemas, como ele Hugo gerador de sites estáticos, tem um recurso que reconstrói automaticamente o seu portal da web se um arquivo for alterado ou 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 portal da web em seu navegador enquanto edita os arquivos que compõem seu site. Cada vez que você salva suas alterações ou cria um arquivo, o portal da web é reconstruído em milissegundos e as alterações são enviadas para o seu navegador. O feedback instantâneo é fantástico.

a entr O comando traz esse tipo de capacidade para qualquer conjunto de arquivos. O comando que é lançado quando uma mudança é detectada é arbitrário. Pode ser um comando padrão do Linux, um pseudônimo, uma função shell ou um script.

Instalação de entrada

Instalar entr no Ubuntu, use este comando:

sudo apt-get install entr

Instalar entr no Fedora, escriba:

sudo dnf install entr

Em manjaro, o comando é:

sudo pacman -Syu entrar

Um exemplo simples

Usaremos o comando de toque para criar um arquivo de texto chamado “exemplo.txt” e dizer entr monitorar aquele arquivo.

a entr O comando aceita os nomes de arquivo que deve monitorar por meio de STDIN e aceite o comando a ser executado como parâmetros de linha de comando.

A maneira mais simples de passar um nome de arquivo para entr é usar ls para listar e canalizá-lo para entr. Quando o arquivo muda, entr Vou configurar isso wc comando para conte as linhas, palavras e personagens no arquivo.

a /_ 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, tal como *.txt , a /_ O parâmetro será substituído pelo último arquivo a ser alterado.

toque em example.txt
ls example.txt | entrada wc / _

Sempre que as alterações são salvas no arquivo, entr lança wc . Para deter entr, pegar q, o Ctrl+c .

RELACIONADO: O que são stdin, stdout y stderr en Linux?

Usos práticos

Agora que vimos entr em ação e compreender o princípio, vamos dar uma olhada em alguns cenários mais úteis.

Vai entr monitorar arquivos no diretório atual. Se algum dos arquivos for modificado, nós queremos entr para almoçar make para que possamos reconstruir nosso projeto. Vamos acorrentar outro comando make test, para executar alguns testes na nova construção. O operador AND && só irá lançar o segundo comando se o primeiro completar sem problemas.

a -s Opção (Concha) garante que o interpretador usado é aquele definido na variável de ambiente SHELL. Isso garante entr recebe o código de saída do primeiro make comando.

ls | entr -s 'make && fazer teste '

Usando o ls comando para enviar a lista de todos os nomes de arquivo no diretório para entr é um pouco desajeitado. 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 design ou uma lista de tarefas. Você não precisa reconstruir seu projeto toda vez que alterar um desses arquivos sem código.

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 '

Desde já, não estamos limitados a lançar make. Você pode ter um script de construção personalizado que prefere usar.

ls *.[CH] | entr script.sh

Aproveitando o Git

a entr o comando não é Git-ware, mas ainda podemos usar alguns dos recursos do Git para suavizar nosso fluxo de trabalho.

a git ls-file O comando irá listar os arquivos que estão no índice Git e na árvore fonte de trabalho, levando em conta as exceções que foram definidas em seu arquivo “.gitignore”. Essa é uma lista preparada dos arquivos que nos interessam, portanto, vamos usá-lo como a fonte dos arquivos para monitorar.

git ls-files | entr script.sh

a ls-files O comando aceita opções de linha de comando. Eles podem ser usados ​​para filtrar ainda mais ou aumentar a lista de arquivos retornados pelo Git:

  • -C: Mostrar arquivos em cache.
  • -D: Mostrar arquivos excluídos.
  • -metro: Mostrar arquivos modificados.
  • -o: Mostrar arquivos não rastreados.

a --exclude-standard A opção é uma forma abreviada de dizer ao Git para ignorar os arquivos que correspondem às entradas nos “arquivos .git / informação / excluir", local ".gitignore" e global ".gitignore".

git ls-files -cdmo --exclude-standard | entr 'make && fazer teste '

Isso detectará muitas 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 alguns scripting Bash e um entr.

a -d (diretório) opção causa entr para monitorar arquivos em um diretório e sair se um novo arquivo for adicionado. Embrulhando nosso entr comando em um while/do ciclo, tudo entr A linha de comando será reiniciada automaticamente, e o novo arquivo será selecionado e agido em cima. Arquivos e diretórios cujos nomes começam com um período “."Eles são ignorados.

enquanto verdadeiro; Faz

  { git ls-files; git ls-files . --excluir padrão --outros; } | entr -d ./script.sh

done

Reiniciando servidores e intérpretes

Talvez você trabalhe com um linguagem interpretada mesmo que Rubi. Cada vez que o seu arquivo de programa é alterado, você deve parar e reiniciar o interpretador Ruby. Você pode lidar com esses tipos de casos de uso com o -r (reiniciar) opção.

Para monitorar um arquivo de programa chamado “hello_world.rb”, e para parar e reiniciar o interpretador Ruby toda vez que o arquivo do programa muda, use este comando:

ls hello_world.rb | entr -r ruby ​​hello_world.rb

Cada vez que o arquivo do programa é editado e salvo, o interpretador Ruby é reiniciado e o programa recarrega.

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 em seu disco rígido.

coloca "Olá, Leitores CloudSavvyIT!"

Você pode ver as três saídas na captura de tela. Se você pressionar o spacebar, entr irá reiniciar o comando quer você tenha alterado o arquivo do programa ou não.

Não apenas para programadores

Porque o comando lançado por entr pode ser qualquer coisa, incluindo scripts de shell, o escopo para usar entr automatizar processos é praticamente ilimitado.

Talvez você tenha um diretório com arquivos colocados nele por FTP seguro, o rsync, o Cacho. Você pode ter esses arquivos copiados automaticamente em outro lugar, são compactados ou pesquisados grep para a palavra “erro”.

Isso o torna uma ótima ferramenta para administradores de sistema e desenvolvedores..

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.