Vous êtes sur la page 1sur 52

1.

Prefcio
Bem-vindo(a) ao "Dialog --tudo", uma documentao completa do programa Dialog escrita em portugus. O Dialog um programa usado para desenhar interfaces amigveis para o usurio, com botes e menus, a partir de um Shell Script. Um Shell Script um programa feito para funcionar no interpretador de comandos (prompt) padro do UNIX/Linux, como o Bourne Shell, ou o Bash. Para obter os conhecimentos que este documento se prope a transmitir, o leitor deve ter:

Conhecimento prvio de programao Shell; Uma Shell disponvel para testar os exemplos; O Dialog instalado e funcionando em sua mquina.

Se voc ainda no tem o Dialog, instale o programa direto do CD da sua distribuio de Linux, ou baixe os fontes. Tudo certo? Ento boa leitura!

2. Introduo

2.1. O que o Dialog


O Dialog um programa para console (modo texto) que desenha caixas de dilogo ("dialog boxes") na tela, similares as do modo grfico, com botes, entradas para texto e menu. Essas caixas so utilizadas para compor interfaces amigveis com o usurio, para que ele responda perguntas ou escolha opes. O Dialog um executvel e recebe todos os parmetros via linha de comando, ento ele geralmente usado dentro de um Shell Script. Serve para fazer programas interativos, que o usurio precisa operar durante sua execuo. Tarefas comuns feitas com o Dialog so escolher uma opo em um menu, escolher um arquivo, uma data, e digitar frases ou senhas. Com o Dialog possvel fazer programas em shell que se "parecem" com programas grficos, onde o usurio v apenas telas e navega entre elas apertando os botes de "OK" e "CANCELAR". Um exemplo clssico desse tipo de interface so os programas de instalao de software. Utilizando este conceito de telas, possvel "amarrar" o usurio ao programa, lhe apresentando as opes disponveis, sem que ele precise ter acesso direto linha de comando. til para logins restritos e para ajudar iniciantes.

2.2. Breve histrico do Dialog

O Dialog original antigo e no mais desenvolvido, foi at a verso 0.3 Outros programadores o adotaram e continuaram o desenvolvimento at a verso 0.7. Depois surgiu o "cdialog" (ComeOn Dialog), como um Dialog melhorado, baseado no original. O cdialog continuou evoluindo e acabou se tornando o oficial, sendo renomeado para "dialog". Este o Dialog que veremos aqui.

2.3. Seu primeiro comando com o Dialog


Mas vamos direto a um exemplo para que voc conhea "a cara" do Dialog. Sente numa posio confortvel e digite na shell o seguinte comando: $ dialog --msgbox 'minha primeira tela' 5 40 Imediatamente sua tela ficar assim:

Fcil no? Desenhamos uma caixa de mensagens (msgbox) de tamanho 5 por 40. O Dialog reconhece vrios tipos de "caixas", e esta msgbox uma das mais simples. Os dois nmeros passados no final do comando definem o tamanho da caixa que queremos desenhar, nesse caso 5 linhas e 40 colunas (No confundir com pixels, pois estamos no console!).

2.4. Listagem dos 15 tipos de caixas


Para saciar a curiosidade do leitor, aqui esto listados todos os tipos de caixa suportadas pelo Dialog:
Tipo da caixa Desenha uma caixa onde o usurio...

calendar

V um calendrio e escolhe uma data

checklist

V uma lista de opes e escolhe vrias

fselect

Digita ou escolhe um arquivo

gauge

V uma barra de progresso (porcentagem)

infobox

V uma mensagem, sem botes

inputbox

Digita um texto qualquer

menu

V um menu e escolhe um item

msgbox

V uma mensagem e aperta o boto OK

passwordbox

Digita uma senha

radiolist

V uma lista de opes e escolhe uma

tailbox

V a sada do comando tail -f

tailboxbg

V a sada do comando tail -f (em segundo plano)

textbox

V o contedo de um arquivo

timebox

Escolhe um horrio

yesno

V uma pergunta e aperta o boto YES ou o NO

notvel que a variedade grande e temos caixas para vrios tipos de tarefas. Algumas caixas so novas e foram introduzidas em verses mais recentes do Dialog. Caso alguma dessas caixas no funcione na sua mquina, atualize o seu Dialog para a verso mais recente ou confira se ele foi compilado com todas as caixas disponveis.

3. Exemplos dos tipos de caixa


Agora que j sabemos como a cara do Dialog, e quais so todos os tipos de caixas disponveis, com certeza o leitor deve estar afoito para cruzar essas duas informaes e ver a cara de todas as caixas, no? isso o que veremos agora, uma listagem completa com um exemplo funcional de cada tipo de caixa, constando um foto da tela e a linha de comando usada para ger-la. Como uma maneira de contextualizar nossa listagem, inventamos o IIV, que o Instalador Imaginrio do Vi. As telas seguintes fazem parte desse instalador, que instala e configura o editor de textos Vi em sua mquina. Instrues Importantes:

No veja essa lista com pressa.

Analise com ateno os detalhes de cada tela, acompanhe na linha de comando as opes e parmetros utilizados, redigite (ou copie e cole) os comandos na sua Shell e veja os exemplos "ao vivo".

Experimente mudar alguns parmetros e ver o que acontece, explore as possibilidades. No se preocupe agora em "como" o Dialog funciona, mas sim com "o qu" ele faz. Descubra-o, experimente-o, de graa! Faa desse momento uma apresentao, imerso e aprendizado, para entrar no mundo do Dialog.

IMPORTANTE: Releia e siga as instrues acima! Ao final dessa viagem, se voc seguir as instrues acima, com certeza voc ter uma boa idia dos poderes do Dialog, do quanto ele pode lhe ser til e de onde voc poder aplic-lo. No se assuste se de repente voc ficar cheio de idias e ter vontade de fazer uns 5 programas diferentes agora mesmo, isso normal! :). O Dialog tem esse poder de seduo por sua simplicidade e flexibilidade. Nota: A quebra dos comandos em vrias linhas apenas esttica, no obrigatria.

3.1. Calendar
dialog \ --title 'Escolha a data' \ --calendar '' 00 31 12 1999 \ \

3.2. Checklist
dialog \ \ --title 'Seleo dos Componentes'

--checklist 'O que voc quer instalar?' \ 000 \ on \ off \

syntax 'Arquivos de sintaxe' mouse 'Suporte a mouse'

color 'Suporte a cores'

on \

beep 'Driver avanado de som' off

3.3. Fselect
dialog \ --title 'Escolha onde instalar' \ --fselect /usr/share/vim/ 00 \

3.4. Gauge
dialog \ \ --title 'Instalao dos Pacotes'

--gauge '\nInstalando Vim-6.0a.tgz...' \ 8 40 60

3.5. Infobox
dialog --title 'Aguarde' \ \

--infobox '\nFinalizando em 5 segundos...' \ 00

3.6. Inputbox, Passwordbox


dialog --title 'Confirmao' \ \

--passwordbox 'Por favor, confirme a senha:' \ 00

3.7. Menu
dialog --title 'Perfil' \ \

--menu 'Escolha o perfil da instalao:' \ 000 mnima completa \ 'Instala o mnimo' 'Instala tudo' \ \

customizada 'Voc escolhe'

3.8. Msgbox
dialog --title 'Parabns' \ \

--msgbox 'Instalao finalizada com sucesso.' \ 6 40

3.9. Radiolist
dialog --title 'Pergunta' \ \

--radiolist 'H quanto tempo voc usa o Vi?' \ 000 iniciante 'at 1 ano' on \ \ \

experiente 'mais de 1 ano' off guru 'mais de 3 anos' off

3.10. Tailbox, Tailboxbg


tail -f /var/log/messages > out &

dialog

--title 'Monitorando Mensagens do Sistema' \ --tailbox out 00 \

3.11. Textbox
dialog \ \ --title 'Visualizando Arquivo'

--textbox /usr/share/vim/vim60/indent.vim \ 00

3.12. Timebox
dialog --title 'Ajuste o Relgio' \ \

--timebox '\nDICA: Use as setas e o TAB.' \ 00 23 59 30 \

3.13. Yesno
dialog --title 'AVISO' \ \

--yesno '\nO Vi foi instalado e configurado. Voc quer execut-lo agora?\n\n' \ 00

Agora que voc j ficou horas copiando e colando os exemplos, ou redigitando os comandos, j est apto a conhecer o dialog-tour, um script pronto para ser executado que mostra todas as caixas para voc :)

4. Como o Dialog funciona


E ento, j est cheio de idias? Sim timo! Ento vamos continuar o aprendizado e conhecer os detalhes do Dialog para poder us-lo em scripts. No Voc seguiu as instrues do tpico anterior? Sim Ento invista mais um tempo na shell, executando os exemplos, modificando-os, avaliando as possibilidades do Dialog. Veja as figuras, imagine onde voc poderia utilizar aquelas telinhas, nos seus programas atuais, em programas novos que voc poderia fazer... Depois volte aqui e continuamos a leitura. No

uma pena. Nesse ponto do documento voc j seria um conhecedor do Dialog. Considere voltar ao tpico anterior e tentar de novo. O Dialog relativamente simples de usar, mas como ele age um pouco "diferente" dos outros programas do sistema, pode assustar e parecer confuso numa primeira tentativa. Como agora voc j sabe "o qu" o Dialog pode fazer, adiante veremos em detalhes como construir e obter dados das caixas, e aprenderemos algumas caractersticas do Dialog como:

A linha de comando longa, cheia de opes Ele redimensiona o texto e a caixa automaticamente Usa cdigo de retorno para botes Sim/No, Ok/Cancel Usa a sada de erro (STDERR) para textos e itens escolhidos

4.1. Entendendo os parmetros obrigatrios da linha de comando


No Dialog, obrigatrio passar o texto e o tamanho da caixa, sempre. Com isso, a cada chamada do programa, devem haver pelo menos 4 opes na linha de comando. O formato genrico de chamada : dialog --tipo-da-caixa '<texto>' <altura> <largura> texto O texto a palavra ou frase que aparece no incio da caixa, logo aps a primeira linha (borda superior). Passe uma string vazia '' caso no deseje texto. Caso o texto seja maior que o tamanho da janela, ele ser ajustado automaticamente, quebrando a linha. Para colocar as quebras de linhas manualmente, insira o padro '\n' (barra-ene) onde desejar as quebras. Exemplo: 'Primeira linha.\nSegunda.' altura A altura o nmero de linhas que sero utilizadas para desenhar a caixa, inclusive a primeira e a ltima que fazem as bordas superior e inferior. Se informado o nmero zero, o Dialog ajusta automaticamente a altura da caixa para caber o contedo. largura A largura o nmero de colunas que sero utilizadas para desenhar a caixa, inclusive a primeira e a ltima que fazem as bordas esquerda e direita.

Se informado o nmero zero, o Dialog ajusta automaticamente a largura da caixa para caber o contedo. Na prtica, melhor deixar que o Dialog quebre o texto e ajuste o tamanho das caixas automaticamente. Ento nos exemplos desse documento no haver quebras de linha manuais (\n) e os tamanhos sero sempre especificados como "0 0" (zero zero). Nota: Em caixas como o menu, onde tambm preciso passar todos os itens pela linha de comando, h mais parmetros obrigatrios alm dos j citados. Eles sero abordados adiante, no momento oportuno.

4.2. Como reconhecer respostas SIM ou NO


A forma mais bsica de se comunicar com o usurio fazendo perguntas que ele possa responder com Sim ou No. possvel fazer um configurador, ou at mesmo um programinha simples com essas respostas. J foi visto como fazer uma telinha desse tipo: dialog --yesno 'sim ou no?' 0 0 Mas, e dentro de um script, como saber qual foi a resposta do usurio? Qual foi o boto que ele apertou? O Dialog utiliza o cdigo de retorno ("Return Code") para informar qual foi o boto apertado. Como sabemos, o shell guarda esse cdigo dentro da varivel $?. Ento que tal descobrirmos a soluo do problema testando? Execute o seguinte comando duas vezes, e note qual o cdigo de retorno que aparece quando se escolhe "Yes" e quando se escolhe "No". dialog --yesno 'sim ou no?' 0 0 ; echo Retorno: $?

Fcil! Zero para Sim, um para no. Se lembrarmos que todos os comandos UNIX/Linux retornam zero em sucesso e qualquer coisa diferente de zero (geralmente 1) quando ocorre algum erro, fica fcil memorizar. O zero sempre positivo, beleza, sem erro,SIM. O um problema, erro, NO. Memorizando: SIM=0, NO=1 Agora que sabemos isso, fica fcil lidar com as respostas do usurio. Basta usar o if para testar o valor do $?. Um exemplo bem simples: dialog --yesno 'Quer ver as horas?' 0 0

if [ $? = 0 ]; then echo "Agora so: $( date )" else echo 'Ok, no vou mostrar as horas.' fi Caso a mensagem do else no seja necessria, podemos usar o operador && (AND) e deixar o comando bem mais simples: dialog --yesno 'Quer ver as horas?' 0 0 && echo "Agora so: $(date)"

Usando o Dialog fica fcil definir variveis de estado ("flags") ou opes antes da execuo de um programa! Por exemplo, um programa simples para listar arquivos do diretrio atual: #!/bin/sh # lsj.sh -- o script do "ls joiado" # Este script faz parte do http://aurelio.net/shell/dialog

# Zerando as opes cor= ; ocultos= ; subdir= ; detalhes=

# Obtendo as configuraes que o usurio deseja dialog --yesno 'Usar cores?' 0 0 && cor='--color=yes'

dialog --yesno 'Mostrar arquivos ocultos?' 0 0 && ocultos='-a' dialog --yesno 'Incluir sub-diretrios?' 0 0 && subdir='-R' dialog --yesno 'Mostrar viso detalhada?' 0 0 && detalhes='-l'

# Mostrando os arquivos ls $cor $ocultos $subdir $detalhes

Baixar este script

4.3. Como obter o texto que o usurio digitou


A caixa Inputbox serve para pedir que o usurio digite algo. A sua prima a Passwordbox, que tem funcionamento idntico, apenas no mostra na tela o que o usurio digita (til para senhas). Por exemplo, se quisermos que o usurio digite seu nome. Primeiro construmos a telinha: dialog --inputbox 'Digite seu nome:' 0 0 Tudo bem, o usurio digita seu nome, aperta OK e poft! O nome repetido na tela e volta o prompt. Como guardar o que foi digitado numa varivel, para usar depois? O funcionamento padro do Dialog : aps o usurio digitar seu nome e apertar o OK, esse texto mandado para a sada de erro (STDERR). Temos trs maneiras de "pescar" esse texto: 1. Redirecionar a STDERR para um arquivo e ler o contedo desse arquivo 2. Redirecionar a STDERR para a STDOUT 3. Usar a opo --stdout do Dialog Veremos ento essas trs tticas. A primeira consiste em redirecionar para um arquivo, e com certeza a maneira mais incmoda por precisar de um arquivo temporrio, mas tambm mais portvel e que funciona em qualquer Shell. Como todos sabemos como fazer um redirecionamento, vamos direto ao exemplo: dialog --inputbox 'Digite seu nome:' 0 0 2>/tmp/nome.txt

nome=$( cat /tmp/nome.txt ) echo "O seu nome : $nome"

Guardamos na varivel 'nome' o contedo do arquivo temporrio. A notao$(comando) para subshell ser a utilizada em todo o documento. A similar usando crases tambm funciona, mas facilmente confundida com aspas simples, ento ser evitada.

A segunda maneira mais limpa por no precisar criar o arquivo temporrio. Basta utilizar o operador 2>&1 para redirecionar a sada de erro para a sada padro. Com o texto desejado na sada padro, podemos definir a varivel 'nome' diretamente: nome=$( dialog --inputbox 'Digite seu nome:' 0 0 2>&1 ) echo "O seu nome : $nome" Mas acaba sendo incmodo ter que ficar redirecionando a sada de erro sempre, a cada chamada do Dialog. A terceira maneira de obter o texto leva isso em conta e usa uma opo do prprio programa para redirecionar o texto para a sada padro, a --stdout: nome=$( dialog --stdout --inputbox 'Digite seu nome:' 0 0 ) echo "O seu nome : $nome" Das trs formas apresentadas, esta a mais limpa. Assim, nos exemplos seguintes, a opo --stdout ser sempre utilizada. Ah! A caixa Inputbox tambm aceita um ltimo parmetro opcional que o texto inicial j preechido no campo. Exemplo: dialog --stdout --inputbox 'Digite seu nome:' 0 0 "seu nome aqui"

4.4. Como obter o item nico escolhido de um Menu ou Radiolist


J sabemos como fazer telas tipo Sim/No. Mas e se precisarmos ampliar o leque de respostas possveis do usurio, onde tambm poderamos ter "Talvez" ou "No sei" como respostas vlidas? Ou ainda, se precisarmos que o usurio escolha um item de um menu para saber qual das opes ele quer executar? Nesse caso o Sim/No insuficiente, e precisamos usar a caixa do tipo Menu, onde podemos especificar vrios itens diferentes e o usurio escolhe um (e apenas um). Para comear, vamos fazer um exemplo bem bobo: user=$( dialog --stdout --menu 'Bobice:' 0 0 0 1 um 2 dois 3 trs ) echo Voc escolheu o nmero $user

A primeira grande diferena a se notar que a linha de comando do Dialog ficou gigante, cheia de parmetros! Vamos destrinch-la. At o 'Bobice:', nenhuma novidade. Mas seguido dele esto trs zeros onde geralmente s tinha dois! No, isso no erro de digitao :) Os dois primeiros zeros continuam sendo a altura e largura da caixa, isso nunca muda. J o terceiro zero uma propriedade especial do Menu, que indica quantos itens sero "visveis" de uma vez na caixa. Veja a diferena de trocar este zero por um: dialog --stdout --menu 'Bobice:' 0 0 1 1 um 2 dois 3 trs

Agora apenas um item visvel por vez, diminuindo o tamanho da caixa. Isso pode ser til quando o Menu tem muitas opes, mas para que a caixa fique num tamanho aceitvel, mostra-se apenas parte delas por vez e deve-se fazer uma "rolagem" para ver o resto. Logo aps esta definio do nmero de itens, colocamos enfileirados todos os itens do Menu, no formato "<item> <descrio>". Em nosso exemplo so trs itens numricos. Este o formato genrico da linha de comando da caixa Menu: dialog --menu '<texto>' 0 0 <nm-itens> <item1> <desc1> ... <itemN> <descN> nm-itens O nmero mximo de itens do menu que sero mostrados na caixa. Os demais ficaro ocultos e podem ser acessados rolando a lista com as setas do teclado. Caso especificado como zero, o Dialog mostra todos os itens, ou ajusta automaticamente o nmero ideal para que a caixa caiba na tela. item O item deve ser um nome nico, diferente para cada item. O item o texto retornado pelo Dialog ao script, quando o usurio escolhe uma opo. descrio A descrio um texto explicativo que serve para detalhar do que se trata o item.

A descrio pode ser omitida passando a string vazia ''. Exemplo:dialog --menu 'texto' 0 0 0 item1 '' item2 ''
item3 ''

Agora que sabemos compor esse monstro que a linha de comando de um Menu, vamos fazer mais um exemplo, com nomes ao invs de nmeros nos itens do menu: cor=$( dialog --stdout --menu 'As cores:' 0 0 0 amarelo 'a cor do sol' verde 'a cor da grama' azul 'a cor do cu' ) echo Voc escolheu a cor $cor

No to difcil hein? A dica para no se confundir enxergar a linha de comando como vrias pequena partes, identificando e isolando cada uma delas: dialog --stdout --menu 'As cores:' 000 # usa o STDOUT # texto do menu

# altura, largura e nm. itens # item 1 # item 2 # item 3

amarelo 'a cor do sol' verde 'a cor da grama' azul 'a cor do cu'

Por isso que geralmente os comandos Dialog so colocados em vrias linhas, para fazer essa separao em partes e facilitar o entendimento. Para tal, basta "escapar" o final de cada linha do comando (exceto a ltima) com uma barra \. Veja como fica o exemplo anterior quebrado em vrias linhas: cor=$( dialog \ --stdout \ --menu 'As cores:' \ 000\ amarelo 'a cor do sol' \ verde 'a cor da grama' \ azul 'a cor do cu' )

echo Voc escolheu a cor $cor Bem melhor no? Adicionalmente, pode-se alinhar os escapes e os itens para facilitar ainda mais a leitura: cor=$( dialog --stdout \ \ \

--menu 'As cores:' 000 \

amarelo 'a cor do sol' \ verde 'a cor da grama' \ azul 'a cor do cu' ) echo Voc escolheu a cor $cor Esta ser a notao utilizada nos exemplos, por ser a mais didtica. CUIDADO! No coloque comentrios ou espaos em branco aps a barra de escape, ela deve ser o ltimo caractere da linha. dialog --stdout \ # Esse comando invlido. Estes

--yesno texto \ # comentrios no podem estar aqui. 00 O primo prximo do Menu o Radiolist. A nica diferena entre os dois, que no Radiolist possvel definir qual ser o item que j iniciar selecionado. Para isso, cada item composto por trs parmetros: nome, descrio, status. O status deve ser ON ou OFF, para informar se o item est "ligado" (marcado) ou no. Como na Radiolist o usurio s pode escolher um nico item, cuidado na hora de compor o comando, pois apenas um item pode ter o status ON, todos os outros devem ser OFF. Caso precise de uma lista de mltipla escolha, veja o Checklist no tpico seguinte. Usando o exemplo anterior, podemos iniciar a caixa com a cor "verde" j selecionada: dialog --radiolist 'As cores:' 0 0 0 \ amarelo 'a cor do sol' OFF \ verde 'a cor da grama' ON \ azul 'a cor do cu' OFF

Ah! A outra diferena do Radiolist para o Menu que ele usa os parnteses(X) para marcar o item.

4.5. Como obter os itens mltiplos escolhidos de um Checklist


A caixa Checklist idntica a Radiolist j vista, a nica diferena o usurio poder escolher mais de um item; uma caixa de mltipla escolha. Primeiro, vamos fazer um menu com opes para o usurio escolher: estilos=$( dialog --stdout \ --checklist 'Voc gosta de:' 0 0 0 \ rock '' ON \ samba '' OFF \ metal '' ON \ jazz '' OFF \ pop '' ON \ mpb '' OFF ) echo "Voc escolheu: $estilos"

A sintaxe a mesma da Radiolist, e compomos uma lista onde os itens no tm descrio (usando as aspas vazias ''). A diferena agora que temos mais de um item selecionado. Note que o Dialog retorna todos na mesma linha, com cada item escolhido entre aspas duplas. Esse retorno em apenas uma linha requer conhecimento em Sed, Awk ou outro editor programvel para se identificar e extrair corretamente os itens escolhidos. Como isso dificulta o uso do Dialog, ele possui uma opo de linha de comando chamada --separate-output, que ao invs de retornar tudo em uma linha, retorna os itens selecionados um por linha, e sem as aspas. Dessa maneira fica bem mais fcil varrer e descobrir os itens escolhidos com o 'while': estilos=$( dialog --stdout \ --separate-output \ --checklist 'Voc gosta de:' 0 0 0 \ rock '' ON \ samba '' OFF \ metal '' ON \ jazz '' OFF \ pop '' ON \ mpb '' OFF )

echo "$estilos" | while read LINHA do echo "--- $LINHA" done

4.6. E se o usurio apertar o boto CANCELAR?


Voc faz as telinhas, apronta os menus, deixa tudo certinho para funcionar redondo. Mas, no meio do programa, o usurio desiste de tudo e aperta o boto CANCELAR. Como detectar isso? Assim como acontece com os botes Yes/No, o Dialog usa os Cdigos de Retorno para informar se o usurio pressionou o OK ou o CANCELAR. OK=0, CANCELAR=1 Ento sempre aps cada telinha do dialog, coloque o seguinte teste para saber se o CANCELAR foi apertado: [ $? -eq 1 ] && echo 'Boto CANCELAR apertado' Dependendo de como funciona seu programa, voc pode fazer o aperto do CANCELAR retornar tela anterior, ao menu principal, ou ainda ser mais drstico e abandonar o programa. Tudo depende do tipo de navegao que voc quer usar. Alm de apertar o boto CANCELAR, o usurio tambm pode apertar a tecla Esc do teclado. Veja o tpico seguinte.

4.7. E se o usurio apertar a tecla ESC?


Em qualquer tela do Dialog, apertar a tecla Esc gera o cdigo de retorno 255, e abandona a caixa. Ento alm de tratar do boto OK (retorno zero) e do CANCELAR (retorno 1), tambm preciso cuidar da tecla Esc. Dependendo do tipo de sua aplicao, a tecla Esc pode gerar o mesmo procedimento que apertar o boto CANCELAR geraria. Ou ainda, voc pode ter dois procedimentos diferentes, um para cada evento. Tudo depende do tipo de navegao que seu programa utiliza, algumas sugestes: Navegao amarrada a um Menu Principal

Se apertar CANCELAR no Menu Principal, sai do programa Se apertar CANCELAR numa tela secundria, volta ao Menu Principal Se apertar ESC em qualquer tela, sai do programa

Navegao tipo Ida e Volta


Se apertar CANCELAR volta tela anterior Se apertar ESC sai do programa

Veja exemplos completos desses tipos de navegao e do tratamento dos eventos no tpico seguinte.

Caso queira mapear o Esc para o mesmo funcionamento do CANCELAR, voc pode fazer um teste mais genrico como, "se no for o OK": [ $? -ne 0 ] && echo 'Esc ou CANCELAR apertado' Claro, se estiver usando boto de HELP, ele tambm ser mapeado para o CANCELAR, ento cuidado.

4.8. E se o usurio apertar o boto HELP?


O boto de ajuda (HELP) foi adicionado no dialog-0.9b, para us-lo basta adicionar a opo --help-button. O seu cdigo de retorno quando apertado dois. Vamos l, memorizando novamente: OK=0, CANCELAR=1, HELP=2 O teste primrio para saber se ele foi apertado : [ $? -eq 2 ] && echo 'Boto HELP apertado' Para mostrar o texto de ajuda para o usurio, basta usar uma caixa Msgbox se for curto, ou uma Textbox se for algo mais extenso. Depois s voltar para a caixa anterior.

4.9. Como tratar todos os botes e teclas de uma vez?


case $? in 0) echo O usurio apertou o boto OK (ou o Yes) ;; 1) echo O usurio apertou o boto CANCELAR (ou o No) ;; 2) echo O usurio apertou o boto HELP ;; 255) echo O usurio apertou a tecla ESC ;; *) echo Retorno desconhecido;; esac

5. Mergulhando de cabea no Dialog

5.1. Exemplo de menu amarrado (em loop)

#!/bin/bash # tia.sh - o script da tia que precisa usar o computador # Este script faz parte do http://aurelio.net/shell/dialog # # Exemplo de como amarrar o script num menu principal usando # o 'while'. O 'case' usado para identificar qual foi a ao # escolhida. Aps cada ao, ele sempre retorna ao menu # principal. S sai do script caso escolha a ltima opo, # aperte CANCELAR ou ESC. # # til para usar como login shell de pessoas inexperientes ou # fazer utilitrios de aes restritas e definidas. # # FLUXOGRAMA # # # # # # # # INCIO +-----------+ FIM +----------+

+------> | menu |--Esc-----> | sai do | | | | | principal |--Cancel--> | programa | +-----Ok----+ | | +--> +----------+

+--<--1 2 3-4--+--Zero--->---+

# Loop que mostra o menu principal

while : ; do

# Mostra o menu na tela, com as aes disponveis resposta=$( dialog --stdout \

--title 'Menu da Tia' \ --menu 'Oi Tia, escolha o qu voc quer fazer:' \ 000 \

1 'Navegar na Internet' \ 2 'Escrever uma carta' \ 3 'Jogar pacincia' 4 'Perder tempo' 0 'Sair' ) \ \

# Ela apertou CANCELAR ou ESC, ento vamos sair... [ $? -ne 0 ] && break

# De acordo com a opo escolhida, dispara programas case "$resposta" in 1) /usr/bin/mozilla 'http://google.com.br' ;; 2) /bin/mcedit /tmp/carta.txt ;; 3) /usr/games/solitaire ;; 4) /usr/X11R6/bin/xsnow ; /usr/X11R6/bin/xeyes ;; 0) break ;; esac

done

# Mensagem final :) echo 'Tchau Tia!' Baixar este script

5.2. Exemplo de telas encadeadas (navegao sem volta)

#!/bin/sh # encadeado.sh - o script que chega at o final # Este script faz parte do http://aurelio.net/shell/dialog # # Exemplo de como encadear telas usando o operador && (AND). # Caso o usurio desista em qualquer tela (apertando CANCELAR # ou ESC), o script executa o primeiro comando aps a cadeia # de &&. # # til para fazer programas ou brincadeiras onde s h um # caminho certo a seguir para chegar ao final. # # FLUXOGRAMA # # # # # # # # # # INCIO +-------+ | tela1 |--Cancel/Esc--->---+ +--Ok---+ | +----------+

| tela2 |--Cancel/Esc--->---+ +--Ok---+

|---> | desistiu | +----------+

| tela3 |--Cancel/Esc--->---+ +--Ok---+ |

| tela4 |--Cancel/Esc--->---+ +--Ok---+

# # # #

| final | +-------+ FIM

# Funo rpida para chamar a caixa YesNo simnao(){ dialog --yesno "$*" 0 0 }

# Aqui comea o encadeamento de telas com o &&. # Somente apertando o boto OK vai para a prxima tela. # H um 'exit' no final, que sai do script caso o usurio # tenha chegado at o fim da cadeia. simnao 'Quer continuar?' &&

simnao 'Estamos na segunda tela. Continua?' && simnao 'Terceira. Continua continuando?' && simnao 'Penltima tela! E agora, continua?' && echo 'Voc chegou at o final!' && exit

# Este trecho j no faz mais parte do encadeamento, e s # ser alcanado caso o usurio tenha apertado CANCELAR/Esc. echo Voc desistiu antes de chegar no final... Baixar este script

5.3. Exemplo de telas com navegao completa (ida e volta)

fim

#!/bin/bash # navegando.sh - o script que vai e volta # Este script faz parte do http://aurelio.net/shell/dialog # # Exemplo de como ligar todas as telas do programa entre si, # guardando informaes de ida e volta. O boto CANCELAR faz

# voltar para a tela anterior e o OK faz ir prxima. Para # sair do programa a qualquer momento basta apertar o ESC. # # til para fazer programas interativos, de contexto, ou que # se pode voltar para corrigir informaes. # # FLUXOGRAMA # # # # # # # # # # # # # # # # INCIO +-----------+ | primeira |--Esc--->---+ .--------> +----Ok-----+ |

`--Cancel--| nome |--Esc--->---+ .--------> +----Ok-----+ | +----------+

`--Cancel--| idade |--Esc--->---+---> | Sai do | .--------> +----Ok-----+ | | Programa | +----------+

`--Cancel--| est.civil |--Esc--->---+ .--------> +----Ok-----+ |

`--Cancel--| gostos |--Esc--->---+ +----Ok-----+ | final | +-----------+ FIM

proxima=primeira

# loop principal while : ; do

# Aqui identificada qual tela deve ser mostrada. # Em cada tela so definidas as variveis 'anterior' # e 'proxima' # que definem os rumos da navegao.

case "$proxima" in primeira) proxima=nome dialog --backtitle 'Pegador de Dados' \ --msgbox 'Bem-vindo ao pegador de dados!' 0 0 ;; nome) anterior=primeira proxima=idade nome=$(dialog --stdout \ --backtitle 'Pegador de Dados' \ --inputbox 'Seu nome:' 0 0) ;; idade) anterior=nome proxima=casado idade=$(dialog --stdout \ --backtitle 'Pegador de Dados' \ --menu 'Qual a sua idade?' 0 0 0 \ 'menos de 15 anos' '' \ 'entre 15 e 25 anos' '' \ 'entre 25 e 40 anos' '' \ 'mais de 40 anos' '' ) ;; casado) anterior=idade proxima=gostos casado=$(dialog --stdout \ --backtitle 'Pegador de Dados' \ --radiolist 'Estado civil:' 0 0 0 \ 'solteiro' 'livre leve solto' ON \ 'noivo' 'quase amarrado' OFF \

'casado' 'j era'

OFF \

'vivo' 'livre de novo' OFF ) ;; gostos) anterior=casado proxima=final gostos=$(dialog --stdout \ --separate-output --backtitle 'Pegador de Dados' \ \

--checklist 'Do que voc gosta?' 0 0 0 \ 'jogar futebol' 'pescar' '' off \ '' off \ '' off \

'ir ao shopping'

'andar de bicicleta' '' off \ 'ficar na internet' '' off \ 'dormir' ;; final) dialog \ --cr-wrap \ --sleep 5 \ --backtitle 'Pegador de Dados' \ --title 'Obrigado por responder' \ --infobox " Os dados informados foram Nome : $nome Idade : $idade Casado: $casado Gostos: \n$gostos " 14 40 break ;; '' off )

*) echo "Janela desconhecida '$proxima'." echo Abortando programa... exit esac

# Aqui feito o tratamento genrico de Cdigo de Retorno # de todas as telas. Volta para a tela anterior se for # CANCELAR, sai do programa se for ESC. retorno=$? [ $retorno -eq 1 ] && proxima=$anterior # cancelar [ $retorno -eq 255 ] && break # Esc

done Baixar este script

5.4. Exemplo de pedido de confirmao (uma caixa sobre outra)

#!/bin/sh # duas.sh - o script que pede confirmao

# Este script faz parte do http://aurelio.net/shell/dialog # # Exemplo de como fazer caixas sobrepostas, onde a nova caixa # aparece sobre a primeira, tpico de avisos como: # # "Voc tem certeza?" # # O fonte do prprio script usado como a "licena", mas na # vida real, basta trocar o $0 por um arquivo como o COPYING #

dialog --title 'LICENA do Software' --textbox $0 16 65 \ --and-widget \ --yesno '\nVoc aceita os Termos da Licena?' 8 30 Baixar este script

5.5. Exemplo de posicionamento de caixas (no centralizado)

#!/bin/sh # posicao.sh - o script que posiciona a janela # Este script faz parte do http://aurelio.net/shell/dialog # # Com a opo --begin, possvel definir qual vai ser o

# posicionamento da caixa na tela. A sintaxe "--begin X Y", # onde X e Y so as coordenadas de LINHA e COLUNA onde vai # estar o canto superior esquerdo da caixa. # # Por exemplo, para grudar a caixa no canto esquerdo da tela, # a partir da linha 5:

dialog --begin 5 0 \ --msgbox 'Eu estou grudada no canto esquerdo' 10 30 Baixar este script

5.6. Exemplo de vrias caixas na mesma tela (multicaixas!)

#!/bin/sh # multi.sh - o script que desenha vrias janelas # Este script faz parte do http://aurelio.net/shell/dialog # # Exemplo de como desenhar vrias caixas numa mesma tela, # usando a opo --and-widget para juntar as caixas e o opo # --begin para pocisionar as janelas. # # # Brincando de Posicionar Caixas # -----------------------------# # Usando a opo --begin, definimos o posicionamento da # caixa. Usando a opo --and-widget, colocamos mais de uma # caixa na tela. Usando essas duas opes juntas, podemos # mostrar vrias janelas inteiras na tela sem sobreposio! # # Por exemplo, que tal dividir a tela em 4 partes iguais e # colocar uma janela em cada uma dessas partes? Isso pode ser # til para mostrar ao usurio o "histrico" das telas que # ele j passou. #

# O clculo de posicionamento simples. O tamanho padro de # tela do console 80 colunas por 25 linhas. Para facilitar, # consideremos o tamanho da tela de 80x24, para usarmos # nmeros pares somente. A ltima linha da tela no ser # usada. # # Se queremos 4 caixas, basta dividir tanto as colunas quanto # as linhas por 2 e teremos quatro "pedaos" iguais na tela: # # # # # Com isso, sabemos que todas as janelas tero 12 linhas e 40 # colunas. Esses nmeros tambm definem as coordenadas de # posicionameto: # # # # # # # # # # # # # Obs.: O --no-shadow usado para que a caixa no tenha # # sombra. Coordenadas: ( x, y ) 0, 0 0,40 12, 0 12,40 | 0,0 | 0 40 80 colunas 80/2 = 40 25/2 = 12

0+---------+---------+ | 0,40 | #1| #2|

12+---------+---------+ | 12,0 | 12,40 | | #3| #4|

24+---------+---------+ linhas

dialog --no-shadow \

--begin 0 0 --msgbox 'Janela #1 -- (0,0) ' 12 40 --and-widget \ --begin 0 40 --msgbox 'Janela #2 -- (0,40) ' 12 40 --and-widget \ --begin 12 0 --msgbox 'Janela #3 -- (12,0) ' 12 40 --and-widget \ --begin 12 40 --msgbox 'Janela #4 -- (12,40)' 12 40

# Fracionando mais as coordenadas, d pra fazer muitas firulas. # 100% intil, mas legal de ver &:) # dialog --no-shadow \ --begin 0 0 --infobox DIALOG 6 20 --and-widget \ --begin 0 40 --infobox DIALOG 6 20 --and-widget \ --begin 6 20 --infobox DIALOG 6 20 --and-widget \ --begin 6 60 --infobox DIALOG 6 20 --and-widget \ --begin 12 0 --infobox DIALOG 6 20 --and-widget \ --begin 12 40 --infobox DIALOG 6 20 --and-widget \ --begin 18 20 --infobox DIALOG 6 20 --and-widget \ --sleep 6 --begin 18 60 --infobox DIALOG 6 20 Baixar este script

5.7. Exemplo de menu com itens dinmicos (definidos em execuo)

#!/bin/bash # users.sh - Compe menus com os usurios do sistema # Este script faz parte do http://aurelio.net/shell/dialog # # Exemplo de como construir menus dinmicos, onde os itens # so a sada de um comando. Nos exemplos, sero obtidos os # dados do arquivo /etc/passwd, como login, UID e nome. # # So trs exemplos: # # 1) O mais simples. O comando retorna um login por linha. # # # # # # # # 2) Aqui, o prprio comando j retorna dois campos por # # # linha, no formato login:uid. Depois foi usado o tr pra trocar os : por espaos, separando os dados e deixando pronto para usar no menu. Como cada entrada do menu precisa de dois campos, no segundo campo foi colocado uma letra 'o', para ficar esteticamente bonito. Poderia ser um ponto '.' ou qualquer outro caractere ou texto. Outra alternativa repetir o login. Isso pode ser feito trocando o comando sed para 's/.*/& &/'.

# # 3) Similar ao segundo, s que ao invs de pegar o 3o # # # # # # # # # # # # dialog --menu "Dois campos por linha, 2o item com espaos" # 0 0 0 root "root" bin "bin" daemon "daemon" adm "adm" # lp "lp" sync "sync" shutdown "shutdown" halt "halt" # mail "mail" news "news" uucp "uucp" operator "operator" # games "games" gopher "gopher" ftp "FTP User" ... # # 12 Agosto 2004 - Aurelio Marinho Jargas Para ficar bem claro o que est acontecendo, troque o 'eval' por um 'echo' para ver qual o comando final que est sendo executado. Aqui est ele: campo do passwd (uid), foi pego o 5o, que o nome completo do usurio. O grande problema aqui que como o nome tem espaos em branco, cada palavra encarada como um parmetro e baguna o menu. A soluo colocar o nome entre \"aspas escapadas\" e usar o 'eval' para executar o comando.

ARQUIVO=/etc/passwd

dialog --menu 'Lista normal de um campo por linha' \ 0 0 10 $(cat $ARQUIVO | cut -d: -f1 | sed 's/$/ o/')

dialog --menu 'Dois campos por linha, sem espaos nos itens' \ 0 0 10 $(cat $ARQUIVO | cut -d: -f1,3 | tr : ' ')

eval \ dialog --menu \"Dois campos por linha, 2o item com espaos\" \ 0 40 10 $(

IFS=: while read login senha uid gid nome resto; do echo $login \"$nome\" done < $ARQUIVO ) Baixar este script

5.8. Exemplo de cpia de arquivos com barra de progresso (Gauge)

#!/bin/bash # copydir.sh - Copia o diretrio mostrando uma barra de progresso # Este script faz parte do http://aurelio.net/shell/dialog # # Uso: copydir.sh <dir-origem> <dir-destino> # # Exemplo de uso da caixa de barra de progresso (gauge), que # diferente e meio complicada de usar. Ela espera receber a

# porcentagem da barra via STDIN, sendo um nmero de 0 a 100. # # O Gauge s mostra na tela a porcentagem que voc informar, # ele no tem inteligncia, ento todo o controle sobre o # processo deve ser feito manualmente pelo programador. # # O procedimento se resume em duas aes: # # 1) Saber como quantificar o TOTAL, para conhecer o 100%. # # # # 2) Saber como descobrir de tempos em tempos o STATUS # # # # # # # Tendo os dois dados no, uma simples regrinha de trs lhe d # a porcentagem atual do andamento: STATUS*100/TOTAL. # # 12 Agosto 2004 - Aurelio Marinho Jargas corrente do procedimento, enquanto ele est sendo executado, para poder calcular o quanto ainda falta para o final (100%). No caso de uma cpia de arquivos, o STATUS a quantidade de arquivos que j foi copiada, ou o espao em disco ocupado por eles. No caso de uma cpia de arquivos, o TOTAL o tamanho total de todos os arquivos a serem copiados.

#................................................................

TITLE='Copiando...' MSG='Copiando o diretrio $ORIGEM para $DESTINO' INTERVALO=1 PORCENTO=0 # intervalo de atualizao da barra (segundos) # porcentagem inicial da barra

#................................................................

ORIGEM="${1%/}" DESTINO="${2%/}"

die() { echo "Erro: $*" ; exit 1 ; } sizeof() { du -s "$1" | cut -f1; } running(){ ps $1 | grep $1 >/dev/null; }

#................................................................

# tem somente dois parmetros? [ "$2" ] || die "Uso: $0 dir-origem dir-destino"

# a origem e o destino devem ser diretrios [ -d "$ORIGEM" ] || die "A origem '$ORIGEM' deve ser um diretrio" [ -d "$DESTINO" ] || die "O destino '$DESTINO' deve ser um diretrio"

# mesmo dir? [ "$ORIGEM" = "$DESTINO" ] && die "A origem e o destino so o mesmo diretrio"

# o diretrio de destino est vazio? DIR_DESTINO="$DESTINO/${ORIGEM##*/}" [ -d "$DIR_DESTINO" ] && [ $(sizeof $DIR_DESTINO) -gt 4 ] && die "O dir de destino '$DIR_DESTINO' deveria estar vazio"

#................................................................

# expanso das variveis da mensagem MSG=$(eval echo $MSG)

# total a copiar (em bytes)

TOTAL=$(sizeof $ORIGEM)

# incio da cpia, em segundo plano cp -r $ORIGEM $DESTINO & CPPID=$!

# caso o usurio cancele, interrompe a cpia trap "kill $CPPID" 2 15

#................................................................

# loop de checagem de status da cpia ( # enquanto o processo de cpia estiver rodando while running $CPPID; do

# quanto j foi copiado? COPIADO=$(sizeof $DIR_DESTINO)

# qual a porcentagem do total? PORCENTAGEM=$((COPIADO*100/TOTAL))

# envia a porcentagem para o dialog echo $PORCENTAGEM

# aguarda at a prxima checagem sleep $INTERVALO done

# cpia finalizada, mostra a porcentagem final echo 100

) | dialog --title "$TITLE" --gauge "$MSG" 8 40 0

#................................................................

echo OK - Diretrio copiado Baixar este script

5.9. Configurando as cores das caixas


possvel configurar as cores de TODOS os componentes das caixas, como textos, borda, botes e fundo da tela. Dessa maneira pode-se personalizar os programas que usam o Dialog para a empresa ou indivduo que o utilizar. Para obter o arquivo padro de configurao do Dialog, basta usar a opo--create-rc. Como o programa procura dentro de seu $HOME por um arquivo chamado .dialogrc, use este comando para comear a brincar de trocar as cores do Dialog: dialog --create-rc $HOME/.dialogrc Agora basta editar o arquivo .dialogrc recm-criado no seu $HOME e executar o Dialog para ver a diferena. As cores que ele reconhece so:
Cor no Dialog Cor

BLACK

Preto

RED

Vermelho

GREEN

Verde

YELLOW

Amarelo

BLUE

Azul

MAGENTA

Rosa

CYAN

Ciano

WHITE

Branco

O formato das configuraes de cores : nome_do_componente = (letra, fundo, letra brilhante?)

Onde para letra e fundo basta colocar os nomes das cores em ingls, e no terceiro parmetro, coloque ON ou OFF para que as letras fiquem brilhantes ou no (claras ou escuras). Exemplo:
(GREEN, BLACK, OFF) = fundo preto, letra verde escuro

(GREEN, BLACK, ON)

fundo preto, letra verde claro

Depois de terminar de configurar as cores, voc pode salvar tudo num arquivo separado, e fazer vrios arquivos diferentes para vrios "temas" ou configuraes diferentes. Para instruir o Dialog a utilizar um arquivo de configurao especfico, e no o padro $HOME/.dialogrc, basta definir a varivel de ambiente$DIALOGRC com o nome arquivo a ser utilizado, por exemplo: export DIALOGRC=$HOME/dialog/tema-verde.cfg ./navegando.sh

Como exemplo, este o arquivo que configurou o Dialog para este tema tipo console verde: # Tema "Verde" tipo console para o Dialog. # Autor: Aurelio Marinho Jargas # Salvar este arquivo como $HOME/.dialogrc # ou definir a varivel $DIALOGRC

# screen use_shadow = OFF use_colors = ON screen_color = (GREEN,BLACK,ON) # box dialog_color = (BLACK,GREEN,OFF)

title_color = (BLACK,GREEN,OFF) border_color = (BLACK,GREEN,OFF) # button button_active_color button_inactive_color button_key_active_color = (BLACK,GREEN,OFF) = (BLACK,GREEN,OFF) = (GREEN,BLACK,OFF)

button_key_inactive_color = (BLACK,GREEN,OFF) button_label_active_color = (GREEN,BLACK,OFF) button_label_inactive_color = (BLACK,GREEN,OFF) # input inputbox_color = (GREEN,BLACK,ON)

inputbox_border_color = (GREEN,BLACK,ON) # textbox searchbox_color = (GREEN,BLACK,ON)

searchbox_title_color = (GREEN,BLACK,OFF) searchbox_border_color = (GREEN,BLACK,OFF) position_indicator_color = (BLACK,GREEN,OFF) # Menu box menubox_color = (GREEN,BLACK,OFF)

menubox_border_color = (GREEN,BLACK,OFF) # Menu window item_color = (GREEN,BLACK,OFF)

item_selected_color = (BLACK,GREEN,OFF) tag_color = (GREEN,BLACK,OFF) = (BLACK,GREEN,OFF) = (GREEN,BLACK,OFF)

tag_selected_color tag_key_color

tag_key_selected_color = (BLACK,GREEN,OFF) check_color = (GREEN,BLACK,OFF)

check_selected_color = (BLACK,GREEN,OFF) uarrow_color darrow_color # Menu item help = (GREEN,BLACK,ON) = (GREEN,BLACK,ON)

itemhelp_color Baixar este arquivo

= (GREEN,BLACK,ON)

6. APNDICE A: Lista das opes de linha de comando

6.1. Opes para definir os textos da caixa


--backtitle <texto>

Especifica o ttulo do topo da tela, que fica no plano de fundo, atrs da caixa (Veja exemplo do "Pegador de Dados").
--title <texto>

Define o ttulo da caixa, colocado centralizado na borda superior.


--cancel-label <texto>

Especifica o texto para ser mostrado no boto "Cancel".


--exit-label <texto>

Especifica o texto para ser mostrado no boto "Exit".


--help-label <texto>

Especifica o texto para ser mostrado no boto "Help".


--ok-label <texto>

Especifica o texto para ser mostrado no boto "OK".

6.2. Opes para fazer ajustes no texto da caixa


--cr-wrap

Mantm as quebras de linha originais do texto da caixa, para no precisar colocar os '\n'. Mas lembrese que caso a linha fique muito grande, o Dialog a quebrar no meio para caber na caixa.
--no-collapse

Mantm o espaamento original do texto, no retirando os TABs nem os espaos em branco consecutivos.
--tab-correct

Converte cada TAB para N espaos. O N especificado na opo '--tab-len' ou o padro 8 assumido.

--tab-len <N>

Especifica o nmero de espaos que sero colocados no lugar de cada TAB, quando usar o opo '-tab-correct'.
--trim

Limpa o texto da caixa, apagando espaos em branco no incio, espaos consecutivos e quebras de linha literais.

6.3. Opes para fazer ajustes na caixa


--aspect <taxa>

Taxa que ajusta o dimensionamento automtico das caixas. a relao largura / altura, sendo o padro 9, que significa 9 colunas para cada linha.
--begin <y> <x>

Especifica a posio inicial da caixa, relativo ao canto superior esquerdo.


--defaultno

Faz o boto 'No' ser o padro da caixa YesNo.


--default-item <item>

Define qual vai ser o item pr-selecionado do Menu. Se no especificado, o primeiro item ser o selecionado.
--shadow

Desenha a sombra da caixa. Opo j usada normalmente.


--no-shadow

No desenha a sombra da caixa.


--no-cancel ou --nocancel

No mostra o boto CANCELAR nas caixas Checklist, Inputbox e Menu. A tecla Esc continua valendo para sair da caixa.
--item-help

Usada nas caixas Checklist, Radiolist ou Menu, mostra uma linha de ajuda no rodap da tela para o item selecionado. Esse texto declarado se adicionando uma nova coluna no final da definio de cada item.
--help-button

Mostra um boto de "Help". Seu cdigo de retorno 2.

6.4. Opes relativas aos dados informados pelo usurio


--separate-output

Na caixa Checklist, retorna os itens selecionados, um por linha e sem aspas. Bom para scripts!
--separate-widget <separador>

Define o separador que ser colocado entre os retornos de cada caixa. til quando se trabalha com mltiplas caixas. O separador padro o TAB.
--stderr

Retorna os dados na Sada de Erros (STDERR). Opo j usada normalmente.


--stdout

Retorna os dados na Sada Padro (STDOUT) ao invs da STDERR.


--max-input <tamanho>

Tamanho mximo do texto que o usurio pode digitar nas caixas. O tamanho padro 2000 caracteres.

6.5. Opes que devem ser usadas sozinhas na linha de comando


--clear

Restaura a tela caso o Dialog a tenha bagunado.


--create-rc <arquivo>

Gera uma arquivo de configurao do Dialog.


--help

Mostra a ajuda do dialog, com as opes disponveis.


--print-maxsize

Mostra o tamanho atual da tela na STDERR.


--print-version

Mostra a verso do Dialog na STDERR.

--version

O mesmo que '--print-version'.

6.6. Outras opes


--ignore

Ignora as opes invlidas. Serve para manter compatibilidade apenas.


--size-err

Opo antiga que no mais usada.


--beep

Apita cada vez que a tela desenhada.


--beep-after

Apita na sada com o Ctrl+C


--sleep <N>

Faz uma pausa de N segundos aps processar a caixa. til para a Infobox.
--timeout <N>

Sai do programa com erro caso o usurio no faa nada em N segundos.


--no-kill

Coloca a caixa Tailboxbg em segundo plano (desabilitando seu SIGHUP) e mostra o ID de seu processo na STDERR.
--print-size

Mostra o tamanho de cada caixa na STDERR.


--and-widget

Junta uma ou mais caixas numa mesma tela (sem limp-la).

7. APNDICE B: Os clones: Xdialog, Kdialog, gdialog, ...


Todos os programas listados aqui so "clones" do Dialog, pois foram feitos para substituir o Dialog, ou dar uma nova roupagem a ele usando bibliotecas grficas. Os clones usam a mesma sintaxe, as mesmas opes de linha de comando, e todos tm o mesmo propsito: ser como o Dialog, s que diferente :)

Alm de fazer tudo o que o Dialog faz, alguns clones evoluram e adicionaram novos tipos de caixa e funcionalidades novas. Dica: possvel fazer um Shell Script que escolha usar o Dialog texto ou o grfico, dependendo se o usurio est no X ou no. Basta checar a existncia da varivel $DISPLAY, que s definida quando o X est sendo executado.

7.1. Whiptail

Clone modo texto, que usa a biblioteca newt ao invs da ncurses. Ele foi escrito pela Red Hat Software para ser utilizado na instalao modo texto do Red Hat Linux. Como baseado numa verso antiga do Dialog, no tem suporte s caixas novas como calendar, fselect e tailbox.

Pacote Debian Pgina de Manual

7.2. Xdialog

o Dialog para a interface grfica, que usa a biblioteca Gtk+.

de longe o Dialog mais "turbinado", pois tambm tem o boto Help que chama a tela de Ajuda da caixa e introduziu vrios tipos novos de caixa como: treeview, buildlist, editbox, rangebox, logbox, spin boxes, combobox, colorsel, fontsel. tambm o clone mais bem documentado, possuindo uma excelente homepage e documentao online. Em especial esta parte da documentao mostra figuras (screenshots) de todas as caixas novas implementadas.

Site oficial Documentao Online

7.3. Kdialog

O Dialog do time do KDE, que usa a biblioteca Qt. Como os grandes "ambientes grficos" gostam de reescrever todos os aplicativos existentes, com o Dialog no podia ser diferente. O Kdialog o Dialog integrado com o ambiente KDE.

FTP Tutorial bem completo em ingls

7.4. gdialog

O antigo Dialog do time do Gnome, que usa a biblioteca Gtk. Aparentemente o Zenity (ver adiante) o novo "Dialog oficial" do Gnome e o gdialog vai ser aposentado. O interessante desse clone que carrega o nome do ilustre Alan Cox como desenvolvedor participante.

7.5. Zenity

O Dialog do time do Gnome, que usa a biblioteca Gtk. Foi projetado para ser mais limpo e bem escrito do que o gdialog, porm se tornou incompatvel com o dialog, pois usa opes diferentes na linha de comando (mais Zen e simples, segundo os autores). H um script que garante a compatibilidade com o gdialog.

Pgina no FreshMeat FTP CVS Artigo em portugus, com exemplos

7.6. Udpm
O "User Dialog Perl Module" no um clone do Dialog, mas uma interface Perl para trabalhar de maneira padronizada com os seguintes "sabores": dialog, cdialog, whiptail, gdialog e Kdialog.

Site oficial

7.7. pythondialog
Mdulo em Python para usar trabalhar de maneira padronizada com os seguintes "sabores": dialog, whiptail e Xdialog.

Site oficial

8. Sobre este documento


A primeira verso levou 5 dias para ser feita, totalizando 27 horas de escrita. Alm da escrita do contedo, nesse tempo tambm foram feitas outras tarefas dignas de uma primeira verso:

(Re)aprendizado do Dialog e leitura de sua documentao, Definio do formato do documento (ordem dos tpicos, layout), Definio do aspecto do documento (fazer o arquivo de estilo CSS), Produo de todas as imagens (testes, screenshot e tratamento).

Este documento foi feito do zero, utilizando 100% Linux e Softwares Livres. Testes

Conectiva Linux 8 como Sistema Operacional Bash 2.04 como Shell Dialog verso 0.9a

Texto

Vim para escrever os textos

Txt2tags para converter o texto fonte para HTML Imagens

Xterm para executar o Dialog no modo grfico (xterm +sb -b 0) xwd (do XFree86) para fazer o dump da janela do Xterm (xwd > arquivo.xwd) ImageMagick para converter de .xwd para .png (convert arquivo.xwd arquivo.png)

Atualmente, os testes so feitos com o dialog verso 0.9b. As novidades em relao verso 0.9a so o boto de Help e as opes novas de linha de comando, registradas no Changelog da verso 5 deste documento.

8.1. Disponibilidade (download)


Este documento est disponvel para leitura e download no formato HTML neste endereo: http://aurelio.net/shell/dialog Para fazer o download do documento, de todas as suas figuras e scripts de exemplo, use os seguintes comandos: mkdir dialog cd dialog wget -m -L http://aurelio.net/shell/dialog/