[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