[ Solucionado BASH - Script ] Dos areas de echo

Buenas tardes,

Es posible en un bash script poder tener dos areas distintas de impresión. Os pongo en contexto para poder explicarme un poco mejor.

Quiero realizar un proceso automático, este proceso esta controlado por un barra de progreso, mostrar la barra de progreso lo tengo mediante esta función

function progreso()
{
        percent=`awk 'BEGIN{printf("%0.2f", '$1' / '$2' * 100)}'`
        MESSAGE="Progreso de ficheros $EXT: $percent %: "
        let COLUMNA=$(tput cols)-$(echo $MESSAGE | wc -m)-2
        echo -en "\r";
        echo -en "$MESSAGE"
        let barra=$1*$COLUMNA; let barra=$barra/$2;let barra2=$COLUMNA-$barra;
        if [ $barra -eq $COLUMNA ];then
                for j in `seq 1 $barra`;do
                        echo -en "\033[44m ";
                done
        else
                for j in `seq 1 $barra`;do
                        echo -en "\033[41m ";
                done
                for k in `seq 1 $barra2`;do
                        echo -en "\033[47m ";
                done
        fi
        echo -en "||\033[40m"
}

Ahora bien como podéis ver la idea es que la linea en la que estoy imprimiendo la barra se mantenga constantemente, pero ahora me gustaría mostrar el log del script a la vez abajo como si fuera otro area distinta, (P.E.: El boot de arranque de RHE).

¿Sería posible desde bash realizar esto?

Un script completo con la barra de estado.

#!/bin/bash
# description:  Ejemplo Barra de progreso
sh_processname="$0"
sh_author="rcarrera"
sh_version="0.1"
sh_date="05/02/2013"

###Variables

    MAX=10

##Funciones

    function progreso()
    {
            percent=`awk 'BEGIN{printf("%0.2f", '$1' / '$2' * 100)}'`
            MESSAGE="Progreso de ficheros $EXT: $percent %: "
            let COLUMNA=$(tput cols)-$(echo $MESSAGE | wc -m)-2
            echo -en "\r";
            echo -en "$MESSAGE"
            let barra=$1*$COLUMNA; let barra=$barra/$2;let barra2=$COLUMNA-$barra;
            if [ $barra -eq $COLUMNA ];then
                    for j in `seq 1 $barra`;do
                            echo -en "\033[44m ";
                    done
            else
                    for j in `seq 1 $barra`;do
                            echo -en "\033[41m ";
                    done
                    for k in `seq 1 $barra2`;do
                            echo -en "\033[47m ";
                    done
            fi
            echo -en "||\033[40m"
    }

##Cuerpo
   
    for i in `seq 1 $MAX`;do
        progreso $i $MAX
        sleep 1
    done
   
    echo -e "\nHa terminado"
    exit 0

mmm.. asi de primeras una opción es refrescar la pantalla entera, dibujando todo de nuevo, es decir la barra de progreso y abajo la parte visible del log. (Hay alguna variable para ver el tamaño del terminal)

Buscando ncurses para bash, me he encontrado con tput que permite mover el cursor.

Mas utilidades que tal vez te puedan servir
http://www.cyberciti.biz/tips/spice-up- ... ripts.html
http://code.google.com/p/bashsimplecurses/
Pues en Bash script no se... pero en linux C seguro que sí. Tengo por ahí mi practica final de SSOO en la que en C sacaba en modo texto en la pantalla con posiciones absolutas la interface de usuario.

Es muy burda (ah, que recuerdos en la UHU), pero si quieres te la paso por privado. Si ya tienes todo pensado en bash scripting tendrás que currarte unas funciones para manejar solo la salida por pantalla.
Estoy viendo con tput cup puedo mas o menos realizar lo que yo quiero,

Muchas Gracias a los dos.


Edito por si alguien le surge la duda con un ejemplo
#!/bin/bash
# description:  Ejemplo Barra de progreso
sh_processname="$0"
sh_author="rcarrera"
sh_version="0.2"
sh_date="05/02/2013"

###Variables

    MAX=10
    TIME_S=10

##Funciones

    function progreso()
    {
            tput sc; tput cup 0 0;
            percent=`awk 'BEGIN{printf("%0.2f", '$1' / '$2' * 100)}'`
            MESSAGE="Progreso del script: $percent %: "
            let COLUMNA=$(tput cols)-$(echo $MESSAGE | wc -m)-2
            echo -en "\r";
            echo -en "$MESSAGE"
            let barra=$1*$COLUMNA; let barra=$barra/$2;let barra2=$COLUMNA-$barra;
            if [ $barra -eq $COLUMNA ];then
                    for j in `seq 1 $barra`;do
                            echo -en "\033[44m ";
                    done
            else
                    for j in `seq 1 $barra`;do
                            echo -en "\033[41m ";
                    done
                    for k in `seq 1 $barra2`;do
                            echo -en "\033[47m ";
                    done
            fi
            echo -en "||\033[40m"
            tput rc;
    }

    #####SLEEP_TIME
        #Funcion para mostrar el tiempo de espera
        function sleep_time()
        {
            tput sc
            while [ $TIME_S -ne 0 ];do
                tput cup 1 0;tput el;
                echo -en "Tiempo de espera previo a continuar: $TIME_S"
                sleep 1
                let TIME_S=$TIME_S-1
            done
            echo -en "\r"; tput el; tput rc
        }

##Cuerpo

    clear; tput cup 2 0;
    for i in `seq 1 $MAX`;do
        progreso $i $MAX
        echo "Vamos por la posición $i"
        sleep 1
    done
    sleep_time;
    echo -e "\nHa terminado"
    exit 0
No puedes usar perl en vez de ese engendro...? xD
4 respuestas