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

Estudio Gecko / Shutterstock.com

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

El comando de envío

Puede configurar comandos para que se ejecuten en momentos específicos en Linux, utilizando cron. Es fácil, confiable y flexible. Pero, ¿qué sucede si necesita ejecutar los comandos cada vez que cambia un archivo o si se agrega un archivo nuevo a un directorio? Esto también es posible y hay más de una forma de hacerlo. La entr El comando es una forma agradablemente sencilla de lograr esa funcionalidad.

Algunos sistemas, como Hugo Static Site Builder, tienen una función que reconstruye automáticamente su sitio web si cambia un archivo o si se agrega un archivo nuevo al sitio. Esa pequeña característica marca una diferencia significativa en su flujo de trabajo. Con Hugo, puede tener su propia versión de desarrollo del sitio web en su navegador mientras edita los archivos que componen su sitio. Siempre que guarda cambios o crea un archivo, el sitio web se reconstruye en milisegundos y los cambios se envían al navegador. La retroalimentación instantánea es genial.

La entr El comando trae ese tipo de funcionalidad a cualquier conjunto de archivos. El comando que se emite 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 entrada

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 simple ejemplo

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

La entr el comando acepta los nombres de los archivos 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 usar ls para enumerarlo y guiarlo en entr. Cuando el archivo cambia, entr pondrá en marcha wc comando para contar las líneas, palabras y caracteres en el archivo.

La /_ El parámetro es un marcador de posición para el nombre del archivo al que se pasó entr. Si se pasa un grupo de archivos a entr, por ejemplo *.txt , la /_ El parámetro sería reemplazado por el último archivo que se modificará.

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

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

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

Usos practicos

Ahora que hemos visto entr en acción y entender el principio, echemos un vistazo a algunos escenarios más útiles.

nosotros lo haremos entr supervisar archivos en el directorio actual. Si se cambia 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 && iniciará el segundo comando solo si el primero se completa sin problemas.

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

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

Utilizando la ls comando para enviar la lista de todos los nombres de archivo en el directorio a entr es un poco torpe. Es posible que tenga archivos en el directorio que son 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 reconstruir su proyecto cada vez que edita uno de esos archivos sin código.

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

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

Por supuesto, no estamos limitados a lanzar make. Es posible que tenga una secuencia de comandos de compilación personalizada que prefiera utilizar.

ls *.[ch] | entr script.sh

Aprovecha Git

La entr El comando no es Git-ware, pero aún podemos usar algunas de las capacidades de Git para hacer que nuestro flujo de trabajo sea más fluido.

La git ls-file El comando enumerará los archivos ubicados en el índice de Git y el árbol de fuentes de trabajo, teniendo en cuenta las excepciones que se han definido en su archivo ".gitignore". Esta es una lista lista para usar de los archivos que nos interesan, así que usémosla como fuente de los archivos a monitorear.

git ls-files | entr script.sh

La ls-files comando acepta opciones de línea de comando. Estos se pueden usar para filtrar más o aumentar la lista de archivos devueltos por Git:

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

La --exclude-standard es una forma abreviada de decirle a Git que ignore los archivos que coincidan con las entradas en los archivos locales ".git / info / exclude", ".gitignore" y globales ".gitignore".

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

Esto detectará muchas eventualidades, pero no hará frente a la creación de un nuevo archivo. Y el nuevo archivo no estará en Git. Todavía podemos hacer frente a esa situación, utilizando algunas secuencias de comandos Bash y un entr.

La -d (directorio) opción causas entr para monitorear archivos en un directorio y salir si se agrega un nuevo archivo. Envolviendo el nuestro entr comando en un while/do ciclo, todo entr la línea de comando se reiniciará automáticamente y se buscará y seguirá el nuevo archivo. Archivos y directorios cuyos nombres comienzan con un punto ".”Son ignorados.

while true; do

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

done

Reiniciar servidores e intérpretes

Quizás trabajes con un lenguaje interpretado como Ruby. Siempre que se cambie el archivo del programa, el intérprete de Ruby debe detenerse y reiniciarse. Puede administrar 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

Siempre que se edita y guarda el archivo del programa, se reinicia el intérprete de Ruby y se vuelve a cargar el programa.

El programa inicialmente contenía:

puts "Hello, World!"

Se ha modificado para decir:

puts "Hello, CloudSavvyIT!"

Cuando esto fue salvado, entr reinició el intérprete de Ruby y recargó 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 golpeas el spacebar, entr reiniciará el comando independientemente de si ha modificado el archivo del programa o no.

No solo para programadores

Porque el comando lanzado por entr puede ser cualquier cosa, incluidos los scripts de shell, el alcance de uso entr La automatización de procesos es prácticamente ilimitada.

Tal vez tenga un directorio donde los archivos se han colocado a través de FTP seguro, rsync o curl. Puede hacer que estos archivos se copien automáticamente en otro lugar, o que los comprima o busque mediante grep la palabra "error".

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir