shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Diferença de performance entre tput cup lin col e ech


From: Paulo Bettega
Subject: Re: [shell-script] Diferença de performance entre tput cup lin col e echo -e '\e[lin;colH'
Date: Tue, 20 May 2014 15:09:48 -0300
User-agent: Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Thunderbird/24.5.0

Olá Alfredo, vou postar o próprio script, não tenho outro exemplo.
Não é nada profissional, apenas experimento e curiosidade.
É uma tela de login pra minha sobrinha exercitar álgebra :)

Não sei se essa é a melhor forma de formatar a tela, com
vários loops em background, mas não consegui pensar em outro jeito.

Abraços Paulo Bettega


versão com tput =====================================================
#!/bin/bash
#
# 19/may/2014


# trap para matar todos os processos em background
trap    '
        kill $pid_bridge_loop &>/dev/null
        kill $pid1 &>/dev/null
        kill $pid2 &>/dev/null
        kill $pid3 &>/dev/null
        kill $pid4 &>/dev/null
        kill $pid5 &>/dev/null
        kill $pid6 &>/dev/null
        kill $pid7 &>/dev/null
        kill $pid8 &>/dev/null
        tput reset; exit
        ' 0 1 2 3 9 15


# som de fundo
mpg123 -q --loop -1 /usr/share/sounds/Startrek_Enterprise_bridge.mp3 &
pid_bridge_loop=$!

# limpa a tela, esconde o cursor e desenha as bordas
clear
tput civis

echo -e '\e[30;1m'
echo '  
============================================================================'
echo '  
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||'
echo '  
============================================================================'

for linha in {4..19}; do
        tput cup $linha 2
        printf "|\|%71c|/|\n"
done

tput cup 20 2
echo 
'============================================================================'
echo '  
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||'
echo '  
============================================================================'


# desenha luzes piscantes, relógio digital e mais algumas coisas
while :;do
for a in 0 ' '; do
        tput cup 2 20
        echo -en "\e[32;1m $a "
        sleep 1
done
done&
pid1=$!

while :;do
for a in 0 ' ';do
        tput cup 2 29
        echo -en "\e[31;1m $a "
        sleep 0.8
done
done&
pid2=$!

while :;do
a=$RANDOM
if [ $a -gt 255 ]; then
#       tput cup 21 29
#       echo -en "\e[33;0m\e[22;58H"
#       printf " %05d " $a
        continue
else
        num_bin=$(printf "#-=-=- %08d -=-=-#" $(bc <<<"obase=2;$a"))
        tput cup 2 44
        echo -en "\e[m\e[33m $num_bin "
        sleep 0.5
fi
done&
pid3=$!

while :; do
for a in 0 ' ';do
        tput cup 21 11
        echo -en "\e[35;1m $a "
        sleep 0.6
done
done&
pid4=$!

while :; do
for m in {00..59};do
        for s in {00..59};do
                for d in {00..10};do
                        tput cup 21 29
                        echo -en "\e[33;0m $m:$s:$d "
                        sleep 0.1
                done
        done
done
done&
pid5=$!

while :; do
for a in . o O 0 O o; do
        tput cup 21 49
        echo -en "\e[33;1m $a "
        sleep 0.05
done
done&
pid6=$!

while :; do
for a in \| / - \\; do
        tput cup 21 57
        echo -e "\e[34;1m $a "
        sleep 0.05
done
done&
pid7=$!

while :; do
for a in 0 ' ';do
        tput cup 21 69
        echo -en "\e[36;1m $a "
        sleep 0.7
done
done&
pid8=$!

# escreve na tela e processa o cálculo
func_texto()
{
for letra in $( seq 0 $((${#1}-1)) ); do
        tput cup $2 $(( $3+$letra ))
        echo -en "\e[37;1m"
        echo -en "${1:$letra:1}"
        sleep 0.05
done
echo
}

User=$(echo ${USER,,})
User=$(echo ${User^})
sleep 3
func_texto "Atenção Oficial $User." 6 9
func_texto 'Presença requisitada na ponte de comando.' 7 9
sleep 6
func_texto 'Estamos em viagem de retorno ao planeta Terra,' 9 9
func_texto 'e o computador central está com a memória travada' 10 9
func_texto 'pelos cálculos da rota no hiper-espaço.' 11 9
sleep 10
func_texto 'O cálculo que está travando o computador' 13 9
func_texto 'deve ser resolvido manualmente.' 14 9
func_texto 'Sua presença é requisitada para resolver o cálculo.' 15 9
sleep 10
#echo -n -conta-

while :;do :;done
versão com tput =====================================================


versão com echo =====================================================
#!/bin/bash
#
# 19/may/2014



# trap para matar todos os processos em background
trap    '
        kill $pid_bridge_loop &>/dev/null
        kill $pid1 &>/dev/null
        kill $pid2 &>/dev/null
        kill $pid3 &>/dev/null
        kill $pid4 &>/dev/null
        kill $pid5 &>/dev/null
        kill $pid6 &>/dev/null
        kill $pid7 &>/dev/null
        kill $pid8 &>/dev/null
        tput reset; exit
        ' 0 1 2 3 9 15


# som de fundo
mpg123 -q --loop -1 /usr/share/sounds/Startrek_Enterprise_bridge.mp3 &
pid_bridge_loop=$!

# limpa a tela, esconde o cursor e desenha as bordas
clear
tput civis

echo -e '\e[30;1m'
echo '  
============================================================================'
echo '  
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||'
echo '  
============================================================================'

#tput cup 20 2
echo -en '\e[21;3H'
echo 
'============================================================================'
echo '  
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||'
echo '  
============================================================================'

for linha in {5..20}; do
#       tput cup $linha 2
        echo -en "\e[$linha;3H"
        printf "|\|%71c|/|\n"
done


# desenha luzes piscantes, relógio digital e mais algumas coisas
while :;do
for a in 0 ' '; do
#       tput cup 2 20
        echo -en "\e[32;1m\e[3;21H $a "
        sleep 1
done
done&
pid1=$!

while :;do
for a in 0 ' ';do
#       tput cup 2 29
        echo -en "\e[31;1m\e[3;30H $a "
        sleep 0.8
done
done&
pid2=$!

while :;do
a=$RANDOM
if [ $a -gt 255 ]; then
#       tput cup 21 29
#       echo -en "\e[33;0m\e[22;58H"
#       printf " %05d " $a
        continue
else
        num_bin=$(printf "#-=-=- %08d -=-=-#" $(bc <<<"obase=2;$a"))
#       tput cup 2 44
        echo -en "\e[m\e[33m\e[3;45H $num_bin "
        sleep 0.5
fi
done&
pid3=$!

while :; do
for a in 0 ' ';do
#       tput cup 21 11
        echo -e "\e[35;1m\e[22;12H $a "
        sleep 0.6
done
done&
pid4=$!

while :; do
for m in {00..59};do
        for s in {00..59};do
                for d in {00..10};do
#                       tput cup 21 29
                        echo -e "\e[33;0m\e[22;30H $m:$s:$d "
                        sleep 0.1
                done
        done
done
done&
pid5=$!

while :; do
for a in . o O 0 O o; do
#       tput cup 21 29
        echo -en "\e[33;1m\e[22;50H $a "
        sleep 0.05
done
done&
pid6=$!

while :; do
for a in \| / - \\; do
        echo -e "\e[34;1m\e[22;58H $a "
        sleep 0.05
done
done&
pid7=$!

while :; do
for a in 0 ' ';do
#       tput cup 21 59
        echo -en "\e[36;1m\e[22;70H $a "
        sleep 0.7
done
done&
pid8=$!


# escreve na tela e processa o cálculo
func_texto()
{
for letra in $(seq 0 $((${#1}-1))); do
        echo -en "\e[37;1m\e[$2;$(($3+$letra))H"
        echo -en "${1:$letra:1}"
        sleep 0.05
done
echo
}

User=$(echo ${USER,,})
User=$(echo ${User^})

sleep 3
func_texto "Atenção Oficial $User." 6 9
func_texto 'Presença requisitada na ponte de comando.' 7 9
sleep 5
func_texto 'Estamos em viagem de retorno ao planeta Terra,' 9 9
func_texto 'e o computador central está com a memória travada' 10 9
func_texto 'pelos cálculos da rota no hiper-espaço.' 11 9
sleep 10
func_texto 'O cálculo que está travando o computador' 13 9
func_texto 'deve ser resolvido manualmente.' 14 9
func_texto 'Sua presença é requisitada para resolver o cálculo.' 15 9
sleep 15
#echo -n -conta-

while :;do :;done
versão com echo =====================================================









On 20-05-2014 14:43, Alfredo Casanova address@hidden [shell-script] wrote:
Tem como postar uns exemplos?


2014-05-20 14:35 GMT-03:00 Paulo Bettega address@hidden <mailto:address@hidden>
[shell-script] <address@hidden <mailto:address@hidden>>:

    __

    Olá pessoal, estou experimentando formatar a tela com
    vários loops "while :;do ... ;done&". Dentro do loop estão
    animações e texto também animado.

    Na primeira tentativa usei tput cup para posicionar o cursor,
    mas quanto mais elementos eu colocava, mais a tela perdia a formatação.
    Caracteres de outros loops apareciam onde não deviam.

    Então lembrei do echo com os escapes para posicionar o cursor,
    e substituí todos os tput cup por echo - aqui tem uma diferença,
    o tput cup inicia com 0x0 e o echo com 1x1(echo com 0x0 ou 1x1 é o mesmo 
ponto).

    A diferença é impressionante, a tela formatada com echo é muito
    mais sólida, não perde a formatação nem no console puro nem num terminal
    na interface gráfica.

    Abraços Paulo Bettega




--
[]'s
Alfredo Casanova
Linux User #228230
msn: address@hidden <mailto:address@hidden>
tel: +55 61 9655 9619



reply via email to

[Prev in Thread] Current Thread [Next in Thread]