Automatize Comandos no Linux: Watchexec vs. Entr – Qual Escolher?

Se você deseja aprender a executar comandos no Linux sempre que um arquivo em um diretório de trabalho é alterado ou novos arquivos são criados, você está no lugar certo.

No Linux, o agendamento de comandos para execução em momentos específicos pode ser feito através do cron.

Mas, e se você precisar que comandos sejam executados automaticamente toda vez que um arquivo for modificado ou um novo arquivo for adicionado a uma pasta?

Isso é totalmente possível e algumas ferramentas de linha de comando podem facilitar essa tarefa.

Vamos começar!

Watchexec

Watchexec é uma ferramenta útil e autônoma que monitora um diretório específico, executando um comando ao detectar alterações, como atualizações de arquivos ou criação de novos.

Funcionalidades

  • Elimina a necessidade de linhas de comando complexas envolvendo xargs (argumentos estendidos).
  • Monitora em tempo real as alterações no diretório atual e em todos os seus subdiretórios.
  • Não depende de nenhum ambiente de execução de linguagem, sendo independente de qualquer linguagem ou ecossistema específico.
  • Utiliza .gitignore e .ignore por padrão para determinar quais arquivos devem ser ignorados.
  • Utiliza grupos de processos para gerenciar programas bifurcados.
  • Oferece suporte à visualização de arquivos com extensões específicas.
  • Compatível com macOS, Linux e Windows.
  • Permite filtrar e ignorar eventos com base em glob (padrões para busca de nomes de arquivos parcialmente idênticos).

Instalação do Watchexec

Para instalar o Watchexec, cole o seguinte comando no seu terminal e pressione enter:

curl -sS https://webinstall.dev/watchexec | bash

Após a instalação, o caminho onde a ferramenta foi instalada será exibido. No exemplo abaixo, a ferramenta foi instalada em /root/.local/bin.

┌──(root💀kali)-[~]
└─# curl -sS https://webinstall.dev/watchexec | bash

Thanks for using webi to install '[email protected]' on 'Linux/x86_64'.
Have a problem? Experience a bug? Please let us know:
        https://github.com/webinstall/webi-installers/issues

Lovin' it? Say thanks with a Star on GitHub:
        https://github.com/webinstall/webi-installers

Found /root/Downloads/webi/watchexec/cli-v1.18.9/watchexec-1.18.9-x86_64-unknown-linux-musl.tar.xz
Extracting /root/Downloads/webi/watchexec/cli-v1.18.9/watchexec-1.18.9-x86_64-unknown-linux-musl.tar.xz
Installing to /root/.local/opt/watchexec-vcli-v1.18.9/bin/watchexec
Installed 'watchexec vcli-v1.18.9' as /root/.local/bin/watchexec

Após a instalação, verifique se o arquivo foi criado na pasta .local/bin com os seguintes comandos:

cd .local/bin

ls

O próximo passo é adicionar o caminho da ferramenta à variável de ambiente PATH:

export PATH="/root/.local/bin:$PATH"

Para executar, digite ‘watchexec’ no terminal como usuário root. Para ver as opções de uso, utilize:

watchexec --help

Exemplos de Uso

  • Para listar todos os arquivos no diretório/subdiretório toda vez que houver uma mudança:
watchexec -- ls -la
  • Para executar um comando sempre que houver alterações em arquivos com extensões .py, .js, .css ou .html:
 watchexec --exts py,js,css,html <comando>
  • Para executar um comando quando houver alteração em arquivos nas pastas ‘lib’ ou ‘src’:
watchexec -w lib -w src <comando>
  • Para reiniciar um serviço sempre que houver alteração nos arquivos (incluindo subdiretórios):
watchexec -e html -r tor

watchexec -e js,py -r mysql

A opção ‘-r’ reinicia um processo ou serviço em execução no sistema.

Para mais informações sobre o Watchexec, visite o repositório oficial no GitHub.

Entr

Entr é uma ferramenta de linha de comando simples e eficaz que executa comandos quando ocorrem alterações em um determinado diretório.

“Entr” significa Event Notify Test Runner e foi criado com o objetivo de automatizar testes e fornecer feedback rápido.

Instalação

Entr já vem pré-instalado em algumas distribuições Linux. Caso não esteja, você pode instalá-lo manualmente.

A ferramenta é fácil de usar e pode ser instalada com o seguinte comando:

sudo apt-get install entr

Ou você também pode instalá-lo clonando o repositório oficial do GitHub:

git clone https://github.com/eradman/entr.git

Em seguida, navegue até o diretório e instale as dependências:

./configure
make test
make install

Para ver as opções de compilação, execute: ‘./configure -h’

Exemplos de Uso

Para ver as opções e argumentos disponíveis para o comando ‘entr’, utilize:

man entr

Este comando exibe o manual do usuário para ‘entr’.

NAME
     entr — run arbitrary commands when files change

SYNOPSIS
     entr [-acdnprsz] utility [argument /_ ...]

DESCRIPTION
     A list of files provided on standard input, and the utility is executed using the supplied arguments
     if any of them change.  entr waits for the child process to finish before responding to subsequent
     file system events.  A TTY is also opened before entering the watch loop in order to support interac‐
     tive utilities.

     The arguments are as follows:

     -a      Respond to all events which occur while the utility is running.  Without this option, entr
             consolidates events in order to avoid looping.  This option has no effect in conjunction with
             the -r flag.

     -c      Clear the screen before invoking the utility specified on the command line.  Specify twice to
             erase the scroll back buffer.

     -d      Track the directories of regular files provided as input and exit if a new file is added.
             This option also enables directories to be specified explicitly.  If specified twice, all new
             entries to a directory are recognized, otherwise files with names beginning with ‘.’ are ig‐
             nored.

     -n      Run in non-interactive mode.  In this mode entr does not attempt to read from the TTY or
             change its properties.

     -p      Postpone the first execution of the utility until a file is modified.

 Manual page entr(1) line 1 (press h for help or q to quit)
  • Para iniciar ou recarregar automaticamente um servidor MySQL sempre que um arquivo JavaScript for alterado:
 ls *.js | entr -r mysql
  • Para recarregar automaticamente um servidor web, ou encerrar caso o servidor finalize a execução:
$ ls * | entr -rz ./httpd

Para mais detalhes e exemplos do comando ‘entr’, você pode consultar o repositório oficial no GitHub.

Considerações Finais 👩‍💻

Espero que este artigo tenha sido útil para você entender como executar comandos no Linux quando arquivos são alterados ou criados em um diretório.

Você também pode se interessar em aprender como remover arquivos e diretórios no Linux.