sábado, octubre 15, 2005

Mostrar la salida de un comando en varios terminales simultáneamente en linux

Hace tiempo me enfrenté a un pequeño problema: estaba administrando el ordenador de un amigo remotamente para ajustarle la configuración de Gentoo desde ssh y él me preguntó si podía ver los comandos y cambios en los archivos de configuración que yo iba realizando para ir aprendiendo.

Tras comerme un poco la cabeza pensé este sencillo script para bash, que permite ejecutar un comando en un terminal, y simultáneamente redirigir la salida a otro. Lo he llamado execmon.bash. En principio lo pensé para ejecutar tareas como "emerge -up world" y cosas así, pero posteriormente jugando un poco con él, he descubierto que funciona con todos los programas de consola, incluidos los editores. Por ejemplo haciendo
execmon.bash  'nano hola.txt' 5
abrimos un editor y tanto la salida como el texto que vayamos introduciendo se redirigirá al terminal virtual número 5.

Los terminales virtuales disponibles se pueden ver haciendo:
ls /dev/pts
. Cada terminal virtual lleva asociado un número.

Lo he probado con el terminal normal, con konsole y xterm y funciona bien.

Para probarlo basta con crear el fichero execmon.bash y pegar el contenido que adjunto a continuación:


#! /bin/bash
#execmon.bash
#Script para ejecutar un comando en un terminal y mostrar la salida
#en el terminal usado y en otro adicional.
#Publicado por airon, http://webpacifica.blogspot.com
param=$#
if [ $param -eq 2 ]; then
echo $1 | tee a.out && cat a.out > /dev/pts/$2 && exec `cat a.out` | tee /dev/pts/$2 && rm a.out
else
echo "Modo de uso:"
echo "execmon 'comando' num"
echo " -comando es el comando a ejecutar (hay que introducir las ')"
echo " -num es el número de la consola virtual a la que dirigir la salida"
fi


Ejemplo de utlización:

execmon.bash 'ls -l' 5
execmon.bash 'nano hola.txt' 5

3 comentarios:

Anónimo dijo...

y como se haria para desde un terminal /dev/pts/$1 ejecutar comandos en otro terminal /dev/pts/$2

Anónimo dijo...

Un comando rápido para hacer lo mismo
script /dev/pts/x

Dónde x es el terminal correspondiente

SaluditosASB

airon dijo...

Buen apunte. Desconocía totalmente la existencia de ese comando, que realmente facilita la vida. Gracias ;).