Cómo ejecutar un comando de Linux cuando cambia un conjunto de archivos

Contenidos

Efecto dominó.

Aprenda a ejecutar comandos de Linux cuando cambia cualquier archivo en un conjunto de archivos supervisados ​​y cuando se crean nuevos archivos. Le mostramos cómo usar esta herramienta flexible.

El comando entr

Puedes configurar comandos para correr en momentos específicos en Linux, usando cron. Es fácil, confiable y flexible. Pero, ¿qué sucede si necesita ejecutar comandos cada vez que cambia un archivo o si se agrega un archivo nuevo a un directorio? Eso además es factible, y hay más de una forma de hacerlo. los entr el comando es un refrescantemente sencillo forma de lograr esa funcionalidad.

Algunos sistemas, como el Generador de sitios estáticos Hugo, dispone de una función que reconstruye automáticamente su portal web si cambia un archivo o si se agrega un nuevo archivo al sitio. Esa pequeña característica marca una diferencia significativa en su flujo de trabajo. Con Hugo, puede tener su versión de desarrollo del portal web en su navegador mientras edita los archivos que componen su sitio. Cada vez que guarda sus cambios o crea un archivo, el portal web se reconstruye en milisegundos y los cambios se envían a su navegador. La retroalimentación instantánea es fantástica.

los entr El comando trae ese tipo de capacidad a cualquier conjunto de archivos. El comando que se lanza cuando se detecta un cambio es arbitrario. Puede ser un comando estándar de Linux, un alias, una función de shell o un script.

Instalación de entr

Instalar entr en Ubuntu, use este comando:

sudo apt-get install entr

Instalar entr en Fedora, escriba:

sudo dnf install entr

En Manjaro, el comando es:

sudo pacman -Syu entr

Un ejemplo simple

Usaremos el comando táctil para crear un archivo de texto llamado «ejemplo.txt» y decir entr para monitorear ese archivo.

los entr El comando acepta los nombres de archivo que debe monitorear a través de STDIN y acepta el comando que debe ejecutarse como parámetros de línea de comando.

La forma más sencilla de pasar un nombre de archivo a entr es utilizar ls para enumerarlo y canalizarlo en entr. Cuando el archivo cambia, entr pondrá en marcha wc comando para contar las líneas, palabras y caracteres en el archivo.

los /_ El parámetro es un marcador de posición para el nombre de archivo del archivo que se pasó a entr. Si se pasa un grupo de archivos a entr, tal como *.txt , los /_ El parámetro será reemplazado por el último archivo que se cambiará.

touch example.txt
ls example.txt | entr wc /_

Cada vez que se guardan los cambios en el archivo, entr lanza wc . Para detener entr, pegar q, o Ctrl+c .

RELACIONADO: ¿Qué son stdin, stdout y stderr en Linux?

Usos practicos

Ahora que hemos visto entr en acción y comprende el principio, veamos algunos escenarios más útiles.

Haremos entr supervisar los archivos en el directorio actual. Si se modifica alguno de los archivos, queremos entr almorzar make para que reconstruyamos nuestro proyecto. Encadenaremos otro comando make test, para ejecutar algunas pruebas en la nueva compilación. El operador AND && solo lanzará el segundo comando si el primero se completa sin problemas.

los -s La opción (shell) asegura que el intérprete utilizado sea el definido en la variable de entorno SHELL. Esto garantiza entr recibe el código de salida de la primera make mando.

ls | entr -s 'make && make test'

Usando el ls comando para enviar la lista de todos los nombres de archivo en el directorio a entr es un poco torpe. Es factible que tenga archivos en el directorio que forman parte del proyecto pero que en realidad no son archivos de compilación. Tal vez sean notas de diseño o una lista de tareas pendientes. No es necesario que reconstruya su proyecto cada vez que cambie uno de esos archivos sin código.

Podemos refinar el comando para que monitoree solo los archivos de código fuente apropiados. Este comando monitorea el código fuente de C y los archivos de encabezado.

ls *.[ch] | entr -s 'make && make test'

Desde luego, no estamos limitados a lanzar make. Es factible que tenga un script de compilación personalizado que prefiera utilizar.

ls *.[ch] | entr script.sh

Aprovechando Git

los entr el comando no es Git-ware, pero aún podemos usar algunas de las capacidades de Git para suavizar nuestro flujo de trabajo.

los git ls-file El comando enumerará los archivos que están en el índice de Git y en el árbol de fuentes de trabajo, teniendo en cuenta las excepciones que se han definido en su archivo «.gitignore». Esa es una lista preparada de los archivos que nos interesan, por lo tanto usémosla como fuente de los archivos a monitorear.

git ls-files | entr script.sh

los ls-files El comando acepta opciones de la línea de comandos. Estos se pueden utilizar para filtrar más o incrementar la lista de archivos devuelta por Git:

  • -C: Muestra archivos en caché.
  • -D: Muestra los archivos eliminados.
  • -metro: Muestra archivos modificados.
  • -o: Muestra archivos sin seguimiento.

los --exclude-standard La opción es una forma abreviada de decirle a Git que ignore los archivos que coinciden con las entradas en los archivos “.git / info / exclude”, locales “.gitignore” y globales “.gitignore”.

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

Eso detectará muchas eventualidades, pero no hará frente a la creación de un nuevo archivo. Y el nuevo archivo no estará en Git. Aún podemos hacer frente a esa situación, usando un poco de scripting Bash y una función de entr.

los -d (directorio) opción causas entr para monitorear los archivos en un directorio y salir si se agrega un nuevo archivo. Envolviendo nuestro entr comando en un while/do bucle, todo entr La línea de comando se reiniciará automáticamente, y el nuevo archivo se seleccionará y se actuará sobre él. Archivos y directorios cuyos nombres comienzan con un punto «.”Se ignoran.

while true; do

  { git ls-files; git ls-files . --exclude-standard --others; } | entr -d ./script.sh

done

Reinicio de servidores e intérpretes

Tal vez trabajas con un lenguaje interpretado igual que Rubí. Cada vez que se cambia su archivo de programa, debe detener y reiniciar el intérprete de Ruby. Puede manejar estos tipos de casos de uso con el -r (reiniciar) opción.

Para monitorear un archivo de programa llamado «hello_world.rb», y para detener y reiniciar el intérprete de Ruby cada vez que cambia el archivo de programa, use este comando:

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

Cada vez que se edita y guarda el archivo del programa, se reinicia el intérprete de Ruby y se torna a cargar el programa.

El programa inicialmente contenía:

puts "Hello, World!"

Fue editado para decir:

puts "Hello, CloudSavvyIT!"

Cuando esto fue salvado, entr reinició el intérprete de Ruby y volvió a cargar el programa.

El archivo se editó una vez más para agregar la palabra «lectores» y se guardó en el disco duro.

puts "Hello, CloudSavvyIT readers!"

Puedes ver las tres salidas en la captura de pantalla. Si presiona el spacebar, entr reiniciará el comando tanto si ha cambiado el archivo de programa como si no.

No solo para programadores

Debido a que el comando lanzado por entr puede ser cualquier cosa, incluidos los scripts de shell, el alcance para utilizar entr automatizar procesos es prácticamente ilimitado.

Tal vez tiene un directorio que tiene archivos colocados en él por FTP seguro, o rsync, o rizo. Puede hacer que estos archivos se copien automáticamente en otro lugar, se compriman o se busquen por grep para la palabra «error».

Esto lo convierte en una gran herramienta tanto para administradores de sistemas como para desarrolladores.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.