[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]
- Re: [shell-script] Barra de progresso no CP, (continued)
- Re: [shell-script] Barra de progresso no CP,
Julio C. Neves <=