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

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

Re: [shell-script] Barra de progresso no CP


From: Julio C. Neves
Subject: Re: [shell-script] Barra de progresso no CP
Date: Thu, 21 Mar 2019 10:26:03 -0300

Fala Bruno,
O cmd tput é o de pior documentação do man e por isso vou colocar alguns de
seus parâmetros a seguir e peço que vc preste atenção no parâmetro cup
(*cu*rsor
*p*osition), cuja sintaxe é tput cup LINHA COLUNA, ambos com origem zero.

Uma coisa que me deixou encucado no seu código foi o uso do tput civis --
invisible. Eu uso simplesmente tput civis e sei que o -- significa fim de
passagem de opções para o shell p. ex. para pesquisar todos os meus scripts
(*.sh) procurando quais deles usam a opção --title do zenity, o intuitivo
seria fazer:

$ grep -l --title *.sh
grep: opção não reconhecida '--title'
Uso: grep [OPÇÃO]... PADRÃO [ARQUIVO]...
Experimente "grep --help" para mais informações.
columns warning:  no input text was read

Como vc viu ele achou que com o --title eu me referia a uma long option do
cmd grep que, por não existir, deu erro. Para que isso não aconteça eu uso
o -- para dizer que a partir daquele ponto não existem mais opções é sá
dado.
Obs: o cmd columns foi para diminuir o tamanho da saída, especificando-a
com 80 colunas (-W 80)

$ grep -l -- --title *.sh | columns -W 80
AnoNovo.sh                   ArteAscii2.sh                Heitor.sh
albtad.sh                    calc.sh                      calc10.sh
char_redimensiona.sh         conta2.sh                    despertador.sh
dontagain.sh                 md.sh                        mvvm.sh
sorteio.sh                   wm.sh                        yad1.sh
yad2.sh

Dito isso, quero te fazer uma pergunta, que é mais uma curiosidade técnica:
pq vc usou tput civis -- invisible e não tput civis # invisible? Reparei
que no tput qq coisa após o -- equivale a um comentário. Experimente:
$ tput civis -- cursor invisível
$ tput cnorm -- cursor visível em UTF-8

Mais uma pergunta: Pq vc não usa yad, zenity ou dialog para resolver o seu
problema com a barra de progresso de forma mais bonita e simples?
P.ex:

*$ cat bp1.2*

#!/bin/bash

for ((int=1; int<=100; int++))

do

echo $int # Atualizou percentagem

## A próxima linha *não pode* ter comentário pois

#+ ele apareceria na tela.

echo "# Decorridos $int% da tarefa"

sleep 0.13

done | zenity *--*progress --no-cancel \

*--*auto-close *--*width 300 \

*--*title="Exemplo de Progress"
[image: image.png]

Neste exemplo, a linha echo $int continua atualizando a percentagem, porém
a linha echo "# Decorridos $int% da tarefa" fica alterando a saída que fica
no espaço destinado à propriedade *--*text. É bom observarmos que, por ter
usado a opção --no-cancel, os botões do diálogo foram omitidos.

Finalmente a lista dos tputs retirada no meu livro:

Para formatação de tela, além do clear existe uma instrução multifacetada
de uso geral, que é o tput. Veremos a seguir as principais faces dessa
instrução:

   -

   tput cup (cup → *cursor* *position*) – Cuja finalidade é posicionar o
   cursor na tela e cuja sintaxe é a seguinte:

*tput cup lin col*

Onde lin é a linha e col a coluna onde se deseja posicionar o cursor. É
interessante e importante assinalar que a numeração das linhas e das
colunas começa em zero.

   -

   tput home – O mesmo que tput cup 0 0
   -

   tput bold – Coloca o terminal no modo de ênfase, chamando a atenção
   sobre o que aparecerá na tela a partir daquele ponto até a sequência de
   restauração de tela.
   -

   tput smso – Coloca o terminal no modo de vídeo reverso, a partir daquele
   ponto até a sequência de restauração de tela.
   -

   tput rev – Idêntico ao tput smso.
   -

   tput smul – Todos os caracteres, a partir daquele ponto até a instrução
   para restauração de tela, aparecerão sublinhados na tela.
   -

   tput blink – Coloca o terminal em modo piscante, a partir daquele ponto
   até a sequência de restauração de tela (nem todos os *terminfo* aceitam
   esta opção).
   -

   tput sgr0 – Restaura o modo normal do terminal. Deve ser usado após um
   dos três comandos anteriores, para restaurar os atributos de vídeo.
   -

   tput reset – Restaura todos os parâmetros do seu terminal voltando suas
   definições ao *default* do *terminfo* – que está definido na variável do
   sistema $TERM – e dá um clear no terminal. Sempre que possível deve ser
   usado no final da execução de programas que utilizam a instrução tput.
   -

   tput lines – Devolve a quantidade de linhas do monitor corrente,
   terminal corrente ou console (se esta for o monitor corrente).
   -

   tput cols – Devolve a quantidade de colunas do monitor corrente,
   terminal corrente ou console (se esta for o monitor corrente).
   -

   tput ed (ed → *erase* *display*) – Limpa a tela a partir da posição do
   cursor até o fim do monitor corrente, terminal corrente ou console (se esta
   for o monitor corrente).
   -

   tput el (el → *erase* *line*) – Limpa a partir da posição do cursor até
   o fim da linha.
   -

   tput il N (il → *insert* *lines*) – Insere N linhas a partir da posição
   do cursor.
   -

   tput dl N (dl → *delete* *lines*) – Deleta N linhas a partir da posição
   do cursor.
   -

   tput dch N (dch → *delete* *characters*) – Deleta N caracteres a partir
   da posição do cursor.
   -

   tput civis – Torna o cursor invisível (produz o mesmo efeito de setterm
   -cursor off).
   -

   tput cvvis ou tput cnorm – Volta a mostrar o cursor (produz o mesmo
   efeito de setterm -cursor on).
   -

   tput flash – Dá uma claridade intensa e rápida (*flash*) na tela para
   chamar a atenção.
   -

   tput sc (sc → *save* *cursor* *position*) – Guarda a posição atual do
   cursor.
   -

   tput rc (rc → *r**estore* *cursor* to *position*) – Retorna o cursor
   para a última posição guardada pelo sc.
   -

   tput smcup – Bate uma foto atual da tela, limpa-a e salva-a para
   posterior recuperação.
   -

   tput rmcup – Repõe na tela a foto batida com o comando tput smcup.
   -

   tput setaf – Especifica a cor da fonte (*foreground*).
   -

   tput setab – Especifica a cor de fundo (*background*).
   -

   tput op – Restaura as cores de fonte e fundo padrões.
   -

   tput invis – Coloca o terminal invisível.
   -

   stty – Este comando tem uma série imensa de opções de pouco uso, porém
   muito fortes, podendo inclusive alterar as definições do *terminfo*.
   Vale a pena, por ser muito usada, esmiuçarmos a opção echo, que serve
   para inibir ou restaurar o eco das teclas no terminal, isto é, caso o seu
   *script* possua um comando stty –echo, tudo que for teclado daquele
   ponto até a ocorrência do comando stty echo não aparecerá no terminal de
   vídeo. É de suma importância para recebermos uma *senha* pela tela.

Com esse comando também se pode colorir a tela. Mais adiante, no Capítulo
8, seção “Mandando no terminal”, você verá outras formas de fazer a mesma
coisa; acho, porém, esta que veremos agora mais intuitiva (ou menos
“desintuitiva”).

Os valores de setaf e setab variam de 0 a 7, e 9 é o valor que restaura as
cores do fonte e/ou do fundo para seu(s) padrão(ões). Veja seus valores e
cores correspondentes na tabela a seguir:

Símbolo

Cor

*0*

Preto

*1*

Vermelho

*2*

Verde

*3*

Amarelo

*4*

Azul

*5*

Magenta

*6*

Ciano

*7*

Branco

*9*

Volta a cor *default*

Como em um livro só é possível utilizar matizes de cinza, fica bastante
complicado mostrar esse padrão de cores, por isso a seguir tem um programa que
você deveria executá-lo para ver todas as possibilidades de combinação de
cores de fonte e de fundo usando o comando tput (como já foi dito, existem
outras formas, mas essa é a melhor).

*$ cat cores1.sh*

#!/bin/bash

for ((b=0; b<=7; b++))

{

tput setab 9; tput setaf 9; echo -n "|"

for ((f=0; f<=7; f++))

{

tput setab $b; tput setaf $f; echo -n " b=$b f=$f "

tput setab 9; tput setaf 9; echo -n "|"

}

echo

}

tput setab 9; tput setaf 9

Os matizes das cores das fontes variam um pouco se a opção tput bold estiver
ativa (normalmente a cor com ênfase é um tom mais claro). Execute o
programa a seguir que você verá essas diferenças.

*$ cat cores4.sh *

#!/bin/bash

# cores4.sh - Lista as cores da console com bold

clear

for ((Cor=0; Cor <=7; Cor++))

{

for Modo in sgr0 bold

{

tput $Modo

tput setaf $Cor

printf -v Linha "%-$(tput cols)s" "-Em-modo-$([ $Modo = sgr0 ] && echo
Normal || echo "Bold ")-"

sed "s/ /█/g" <<< "$Linha"

}

tput sgr0

}

Neste exemplo o printf foi usado para formatar a saída, preenchendo-a com
espaços em branco até o tamanho da linha do terminal e jogando-a na variável
$Linha (por causa da opção -v). O sed trocou os espaços em branco por este
símbolo que preenche todo o espaço destinado a cada letra (█).

A seguir, um exemplo de como se salva/recupera a tela. Aproveitando a
oportunidade, mostramos diversas opções da instrução tput.

*$ cat salva_tela.sh *

#!/bin/bash

(($(tput cols) < 110)) && {

clear; echo Tela precisa de largura mínima de 110 caracteres

exit 1

}

seq 5000 | xargs *Sujando a tela*

Lin=$(($(tput lines) / 2)) *Calculando linha e coluna centrais da tela*

Col=$(($(tput cols) / 2))

tput cup $Lin; tput el; tput bold *Posicionando e apagando a linha central*

tput cup $Lin $((Col-55)); tput setaf 4 *Posicionando e colorindo para dar
mensagem*

echo "Em 10 segundos essa tela será fotografada e se apagará"

tput civis *Cursor invisível para melhorar apresentação*

for ((i=10; i!=0; i--))

{

tput cup $Lin $Col; tput el *Posiciona no centro da tela e limpa núm
anterior*

echo $i

sleep 1

}

tput smcup *Tirando uma foto da tela*

clear *Poderia ter usado tput reset*

tput cup $Lin $((Col-53))

echo "Dentro de 10 segundos a tela inicial será recuperada"

for ((; i<10; i++))

{

tput cup $Lin $Col *Posicionou no centro da tela*

echo $i

sleep 1

}

tput rmcup *Restaurou a foto*

tput cvvis;tput setaf 9 *Restaurou o cursor e cor*

A seguir, um *script* que serve para especificar o par de cores (da letra e
do fundo). Veja:

*$ cat mudacor.sh*

#!/bin/bash

tput sgr0

clear

# Carregando as 8 cores básicas para o vetor Cores

Cores=(Preto Vermelho Verde Marrom Azul Púrpura Ciano "Cinza claro")

# Listando o menu de cores

echo "

Opc Cor

=== ==="

for ((i=1; i<=${#Cores[@]}; i++))

{

printf "%02d %s\n" $i "${Cores[i-1]}"

}

CL=

until [[ $CL == 0[1-8] || $CL == [1-8] ]]

do

read -p "

Escolha a cor da letra: " CL

done

# Para quem tem bash a partir da versao 3.2

#+ o test do until acima poderia ser feito

#+ usando-se Expressoes Regulares. Veja como:

#+ until [[ $CL =~ 0?[1-8] ]]

#+ do

#+ read -p "

#+ Escolha a cor da letra: " CL

#+ done

CF=

until [[ $CF == 0[1-8] || $CF == [1-8] ]]

do

read -p "

Escolha a cor de fundo: " CF

done

let CL-- ; let CF-- # A cor preta eh zero e nao um

tput setaf $CL; tput setab $CF

clear

read -p "Tecle algo para testar as cores que você criou"

tput sgr0; clear

echo Quando quiser essas cores faça: tput setaf $CL\; tput setab $CF

Abraços,
Julio

*» Não tem tempo para fazer um curso presencial?*
*» Na sua cidade não tem nenhum bom curso de Linux?*
*» **Conheça nosso portal educacional e estude conosco: *
*     http://www.dicas-l.com.br/educacao
<http://www.dicas-l.com.br/educacao/>*
*Também damos treinamento em sua empresa*
*em qualquer cidade**, **com certificado **e nota fiscal.*




Em qua, 20 de mar de 2019 às 17:31, address@hidden [shell-script] <
address@hidden> escreveu:

>
>
> Prezados tudo bem?
>
>
> Estava copiando cerca de 400GB esses dias e demorou demais, senti a falta
> de uma barra de progresso/porcentagem, descobri que poderia usar o 'rsync -r
> --progress SOURCE DEST'.
>
>
> Essa solução não me agradou, entao como eu amo nosso querido shell, me
> dispus a criar uma para o CP, e ficou muito boa, porém, sabe quando falta
> aquele detalhe, aquele tempero na comida? então, só que daqui para frente
> eu não sei mais o que fazer para resolver isso, segue o código abaixo.
>
>
> Como eu quero fazer, eu quero que a barra seja exibida da seguinte forma:
>
>
> [ 100%
> ...................................................................................................
> ]
>
>
> Como ela é exibida:
>
>
> [ 100%
> ...................................................................................................
>
>
> O número da porcentagem vai variando, e os pontos também, como eu fiz
> especifico para usar com o CP, tudo funciona muito bem, ele faz tudo
> baseado em procentagem, e em tamanho do arquivo, para poder calcular a
> porcentagem, porém, queria colocar um limite igual no 1° exemplo, mas o
> colchete do final vai ficar andando.
>
>
> Alguem teria uma solução?
>
>
> Desde já muito obrigado pela ajuda de todos.
>
>
>
> Código:
>
>
> ---------------------------------------------------------------------------------------------------------
>
> #!/bin/bash
>
> car=""
> origem="$1"
> destino="$2"
>
> tamanho="$(du -bs $origem | awk '{print $1}')"
>
> zeroo=0
> umm=1
>
> tput civis -- invisible
>
> while [ "$zeroo" -lt "$umm" ]; do
> cp -aR $origem $destino & pid=$!
>
>     while ps -p $pid &>/dev/null; do
>
>     tamanho_origem="$(du -bs $origem | awk '{print $1}')"
>     tamanho_destino="$(du -bs $destino | awk '{print $1}')"
>
>     indice=$(($tamanho_destino * 100 / $tamanho_origem))
>
>     car="$(echo "`seq -s '.' $indice | tr -d [:digit:]`")"
>     for h in er
>         do
>                 echo -ne "\\r[ $indice% $car"
>
>         done
>
>
>         umm=$((umm - 1))
>         tput cnorm -- normal
>     done
> echo ""
> done
>
>
>
>
> ---------------------------------------------------------------------------------------------------------
>
> 
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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