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.