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 com o Dialog


From: Julio C. Neves
Subject: Re: [shell-script] Barra de progresso com o Dialog
Date: Tue, 14 Feb 2017 12:38:49 -0200

Copiando um trecho do livro "Bombando o Shell
<http://www.brasport.com.br/informatica-e-tecnologia/linux/bombando-o-shell-caixas-de-ferramentas-graficas-do-shell-linux/>"
que apresenta diversas ferramentas gráficas do Shell, inclusive o novíssimo
e fantástico yad.

==================================
Diálogo --gauge

Onde:

<Percent> - É um opcional que indica a percentagem inicial (o padrão é zero)

Uma caixa --gauge mostra uma barra de progresso que vai aumentando a medida
que valores são passados para sua entrada primária.

Além destes valores, também podemos passar texto para este diálogo. A forma
de fazê-lo é a seguinte:

   -

   Abra o processo de comunicação com o --gauge mandando o texto XXX para
   sua entrada primária;
   -

   Agora se você mandar números para a entrada primária, eles serão
   considerados atualizações do percentual de tarefa cumprida;
   -

   Se você mandar texto ele será colocado na parte superior da caixa,
   abaixo da linha do --title;
   -

   Para encerrar o processo de comunicação, envie novamente o texto XXX.

Se o XXX não for usado, o texto recebido por sua entrada primária será
ignorado, mas os valores serão entendidos e atualizarão a percentagem
cumprida.

A seguir um exemplo simples do uso deste diálogo:

*Perc=*

*while ((Perc <= 100))*

*do*

*echo $Perc*

*((Perc++))*

*sleep 0.05*

*done |*

*dialog --clear --title "Teste do --gauge no dialog" \*

*--gauge 'Se segura ...' 7 30 0*

Se você executar este fragmento de programa, verá que apesar dele não ter a
tal sequência XXX, a percentagem é atualizada. Porém se houvesse texto, ele
seria ignorado.

Agora um exemplo mais completo:

*$ cat gauge1.dlg*

#!/bin/bash

## Script para testar o diálogo --gauge


Perc=

Pont='|/—\' # Para fazer um hélice do lado direito

m=m # Somente para alterar o verbo falta/faltam

while ((Perc <= 100))

do

echo XXX # Marca início de msgs para o gauge

echo $Perc

echo Incremento a cada 20 centésimos de segundo

echo -n " Falta$m \Zb\Z1$[100-Perc]%\ZB\Zn "

echo para completar a tarefa ${Pont:((Perc%4)):1}

echo XXX # Marca fim de msgs para o gauge

let Perc++

## quando estiver acabando 'faltam' perde o 'm'

#+ e a hélice é desligada

((Perc>98)) && { m=; unset Pont; }

sleep 0.20

done | dialog --clear --colors --title \

"Teste Gauge no dialog" --gauge "" 7 46 0

[image: Imagem inline 1]

Neste exemplo, ainda montei um hélice só de gozação. A variável $Pont recebe
os quatro componentes do hélice na ordem que serão exibidos e a expressão
${Pont:((Perc%4)):1} extrai um caractere de $Pont, cuja ordem é o resto da
divisão de $Perc por 4, isto é, para resto=0 extrai e escreve |, para
resto=1 extrai e escreve /, para resto=2 extrai e escreve — e para resto=3
extrai e escreve \.

Veja ainda que o conteúdo das linhas que estão entre o par de XXX está
sendo exibido. O conteúdo de $Perc, por ser numérico, atualiza a barra de
progresso, ao passo que as outras saídas atualizam a exibição das
orientações passadas ao usuário.

Pode parece maluquice ou sujeira, mas no duro, as cadeias iniciadas
por \Z, servem
como parâmetros de formatação de cor e estilo dos caracteres, desde que a
opção genérica* --colors *seja usada, quando as cores obedecem a seguinte
tabela:

*Código Z*

*Valor*

0

black

1

red

2

green

3

yellow

4

blue

5

magenta

6

cyan

7

white

Para voltar à cor padrão, usa-se \Zn.

A formatação de estilo pode ser feita de acordo com a seguinte tabela:

*Atributo*

*Liga*

*Desliga*

Ênfase

b

B

Reverso

r

R

Sublinhado

U

U

Os atributos são cumulativos, assim sendo, a cadeia \Zb\Z1 coloca o texto
em modo ênfase (*bold*) e em vermelho e a cadeia \ZB\Zn desfaz ambos.

Como --colors é uma opção genérica, pode ser usada nos textos de todos os
diálogos.

Para evitar-se aquele monte de echo que foi usado no exemplo anterior,
poderíamos tê-los substituído todos com o uso de *Here Documents*, da
seguinte forma:

*$ cat gauge2.dlg*

#!/bin/bash

## Script para testar o diálogo --gauge


Perc=

Pont='|/—\' # Ponteiros de um hélice do lado direito

m=m # Somente para alterar o verbo falta/faltam

while ((Perc <= 100))

do

cat <<- FIM # Início do Here Document

XXX # Marca início de msgs para o gauge

$Perc

Incremento a cada 20 centésimos de segundo

Falta$m \Zb\Z1$[100-Perc]%\ZB\Zn para\

completar a tarefa ${Pont:((Perc%4)):1}

XXX # Marca fim de msgs para o gauge

FIM # Fim do Here Document

let Perc++

## Quando estiver acabando, 'faltam' perde

#+ o 'm' e o hélice é desligado

((Perc>98)) && { m=; unset Pont; }

sleep 0.20

done | dialog --clear --colors --title \

"Teste Gauge no dialog" --gauge "" 7 46 0


Neste código cabem algumas observações:

   -

   O hífen após os dois sinais de menor (<<-) foi usado para permitir a
   indentação do código, mas para fazer isso, só podemos únicamente usar
   <TAB>. Os espaços em branco serão condiderados texto, como pode ser
   visto na linha começada por Falta$m;
   -

   A indentação mesmo assim não fica boa e por isso o código perde um pouco
   a legibilidade.

Diálogo --mixedgauge

Onde:

<Percent> - É um opcional que indica a percentagem inicial da barra de
progresso acumulado (o padrão é zero).

<Tit> <Status> - São o nome a ser exibido e o percentual de atualização ou
o *status* deste campo (Veja tabela a seguir com os códigos de *status*).

<Status> pode receber dois tipos de valor inteiro:

   -

   -Valor: o valor absoluto (módulo) de -Valor será apresentado nno centro
   da barra parcial seguido de um símbolo de percentual (%) e a barra de
   progresso correspondente será atualizada para este valor;
   -

   Dígito: Um digito entre 0 e 9 será substituído pelo valor correspondente
   na tabela a seguir:

*Dígito*

*informado*

*Será*

*exibido*

0

Succeeded

1

Failed

2

Passed

3

Completed

4

Checked

5

Done

6

Skipped

7

In progress

8

(blank)

9

N/A

A função deste diálogo é fazer diversas barras de progresso simultaneamente
e mais uma barra que marca o progresso global, isto é, o percentual gerado
entre o valor global e o somatório dos percentuais parciais.

Este diálogo não está preparado para aceitar dados da entrada primária (
*stdin*) como o --gauge.

É muito difícil de arranjar bons exemplos de uso deste diálogo, creio no
entanto que a partir do bash 4.0, que implementou o uso de *threads* usando
o comando coproc, que este diálogo se tornará muito útil para medir o
desempenho dos processos que agora podem ser disparados simultaneamente.

Veja este exemplo, ele é um pouco longo, mas sua lógica é bastante simples.

*$ cat mixedgauge1.dlg*

#!/bin/bash

## Demonstração do diálogo --mixedgauge


function Gauge

{

dialog --title "Demo do diálogo --mixedgauge" \

--mixedgauge "O texto neste diálogo virá aqui" \

0 0 $6 \

"Um processo que será bem concluído:" $1 \

"Processo aos trancos e barrancos:" $2 \

"Um processo que será bem concluído:" $3 \

"Este processo está todo bichado:" $4 \

"Processo p/ fechar com chave de ouro:" $5

sleep 0.1

}


# Um processo que será bem concluído

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

do

Gauge -$i -0 -0 -0 -0 $((i/5))

done

# Processo aos trancos e barrancos

for ((i=0; i<50; i+=10))

do

Gauge 3 -$i -0 -0 -0 $((i/5+20))

sleep 1.5

done

# Um processo que será bem concluído

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

do

Gauge 3 6 -$i -0 -0 $((i/5+40))

done

# Este processo está todo bichado

for ((i=1; i<30; i++))

do

Gauge 3 6 3 -$i -0 $((i/5+60))

done

# Processo p/ fechar com chave de ouro

for ((i=1; i<100; i+=2))

do

Gauge 3 6 3 1 -$i $((i/5+80))

done

Gauge 3 6 3 1 5 100 # Atualiza status=5 do último proc.

[image: Imagem inline 2]

Neste *script* como você pode ver, foram usados diversos comandos for para
simulações de diversas situações que vão desde um fim normal e esperado,
até um aborto de processo.

O que merece destaque são somente as linhas que chamam a função Gauge. Elas
passam os parâmetros para cada uma das barras de progresso parciais e o
último parâmetro é para a barra global.

Durante cada for o valor da variável $i é passado com sinal negativo para
que seja atualizada a barra correspondente. Para as barras anteriores é
passado o *status* do término daquele processo e para as barras que não
foram processadas é passado o valor -0, que é um erro matemático, porém é
assim que se indica um progresso de 0% para uma determinada tarefa.


Abcs,
Julio

*​Damos treinamento em sua empresa por *
*um preço, no mínimo, 50% mais barato que qualquer curso,*
*com certificado e nota fiscal.*

​​
Nosso time de instrutores *in company* é formado somente por
​
​
autores
​ ​
​
de
*Best Sellers​ ​*​laureados ​sobre os temas. P. exemplo:

Shell básico e Programação em Shell Julio Neves
Bacula Heitor Medrado
Zabbix Adail Host
Produção Gráfica e Videografismo Cadunico


Em 14 de fevereiro de 2017 12:04, Maicon Radeschi address@hidden
[shell-script] <address@hidden> escreveu:

>
>
> Bom dia pessoal,
>
> Estou trabalhando em um script para administração e monitoramento de
> alguns firewalls e proxys que tenho aqui no trabalho(umas 100 máquinas
> +/-), para auxiliar o pessoal do noc daqui.
> Tenho uma função para um ping simples que fiz, que exibe uma barra de
> progresso enquanto o comando é executado, meio fake mas funciona e gostaria
> de fazer algo parecido para outros comandos, como traceroute, iperf, etc,
> porém não tenho tido êxito de usar a mesma função para outros comandos,
> alguém teria uma idéia diferente?
>
> Segue a função do ping abaixo,
>
> function _ping(){
> >$ping_log
> pings="10"
> percent="0"
> ping -c $pings $1 1>&2 > $ping_log&
> ( while true;
>     do
>         ps ax | grep -i "ping -c $pings $1" | grep -v grep >/dev/null
>         if [ "$?" -eq "0" ]; then
>             percent=$(( percent + $pings ))
>             if [ "$percent" -le "100" ];then
>                 echo $percent
>             fi
>             sleep 1
>         else
>             echo "100"
>             sleep 1
>             break;
>         fi
> done ) | dialog --clear --no-cancel --stdout --backtitle 'Teste' \
> --title "Aguarde..."             \
> --gauge "Pingando $1" \
> 8 40 0
>
> if [ "$(cat $ping_log)" == "" ]; then
> _displayMessage "FALHA" "Impossivel pingar o endereco $1\n\n Verifique as
> configurações de DNS da maquina ou se o link de internet e rede estao
> ativos"
> else
> _displayText "Resultado do ping para $1" "$ping_log"
> fi
> }
>
> Obrigado!
>
> Maicon Radeschi
> --
> ---
> Maicon Radeschi
>
> 
>


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



reply via email to

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